2016-06-30 10 views
0

Ich habe eine Methode I, die eine variable Anzahl von @selector() Werte und gibt eine richtige NSString, die ich auf dieser Seite vor einer Weile gefunden. Dies ist nützlich, wenn ich Eigenschaftspfade für mich erstelle, weil mir die Idee, Strings dafür zu verwenden, nicht gefällt und ich die Idee mag, dass der Compiler die Werte überprüfen kann, aus denen der Pfad aufgebaut ist. Die Methode ist:Bulding-Eigenschaftspfade programmatisch mit den Selektoren einer anderen Klasse. Wie funktioniert das?

+(NSString *)keyPathFromSelectors:(SEL)firstArg, ... 
{ 
    NSMutableArray *keys = [NSMutableArray array]; 

    va_list args; 
    va_start(args, firstArg); 

    for (SEL arg = firstArg; arg != nil; arg = va_arg(args, SEL)) 
    { 
     [keys addObject:NSStringFromSelector(arg)]; 
    } 

    va_end(args); 

    return [keys componentsJoinedByString:@"."]; 
} 

Das funktioniert schön, aber die Frage ist: Warum? Wenn ich Eigentum auf meinem aktuellen Objekt mit dem Namen person und es hat ein name wäre der Weg person.name offensichtlich sein und der Aufruf an meine Methode würde wie folgt aussehen:

+(NSSet *)keyPathsForValuesAffectingFoo 
{ 
    return [NSSet setWithObject:[self keyPathFromSelectors:@selector(person), @selector(name),nil]]; 
} 

Die name Selektor (sollte nicht) technisch sichtbar in meinem aktuelle Klasse, es ist in der Person Klasse, auf die ich eine Referenz habe so wie ich auf das richtige name SEL Objekt zugreifen?

Antwort

0

Selektoren übernehmen nicht die Garantie, dass die Methode tatsächlich auf dem betreffenden Objekt existiert. Sie können Compilerwarnungen erhalten, dass ein Selektorname nirgendwo existiert, aber Sie werden nicht sicher sein, dass er auf dem Objekt existiert, auf dem er verwendet wird. Zum Beispiel diese kompiliert:

[person performSelector: @selector(applicationDidBecomeActive:)] 

Obwohl applicationDidBecomeActive auf AppDelegate existiert und nicht person.

Jedoch! Diese Art der Sache ist durch Compiler-Makros möglich. Schauen Sie sich die libextobjc-Bibliothek an, die genau die Art von Selektor/Schlüsselpfad zur Verfügung stellt, die Sie suchen. Dies ist es, was eine Menge der Keypath-Magie in ReactiveCocoa antreibt, aber es kann auch eigenständig verwendet werden.