Gibt es ein Wrapper-Objekt für SEL?
-
06-09-2019 - |
Frage
Ich möchte eine NSMutableArray Selektoren hinzuzufügen. Aber da sie undurchsichtige Typen und keine Objekte sind, dann würde das nicht funktionieren, oder? Gibt es ein Wrapper-Objekt, das ich benutzen kann? Oder muss ich meine eigene erstellen?
Lösung
Sie können speichern Sie die NSString Name des Wählers in dem Array und verwenden
SEL mySelector = NSSelectorFromString([selectorArray objectAtIndex:0]);
, um die Wähler von der gespeicherten Zeichenfolge zu erzeugen.
Darüber hinaus können Sie den Wähler als NSInvocation mit so etwas wie
verpackenNSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:mySelector]];
[invocation setTarget:self];
[invocation setSelector:mySelector];
[invocation setArgument:&arg atIndex:2];
[invocation retainArguments];
Dieses NSInvocation Objekt kann dann später in dem Array und aufgerufen gespeichert werden.
Andere Tipps
Sie können es in einer NSValue
Instanz wickeln wie folgt:
SEL mySelector = @selector(performSomething:);
NSValue *value = [NSValue value:&mySelector withObjCType:@encode(SEL)];
und dann der Wert Ihrer NSMutableArray
Instanz.
NSValue valueWithPointer / pointer funktioniert genauso gut.
Sie müssen nur wissen, dass Sie das Array nicht serialise kann (dh schreiben Sie es in einer Datei), wenn Sie das tun wollen, verwenden Sie den NSStringFromSelector Ansatz.
Dies sind alles Möglichkeiten, einen Selektor in ein NSValue Objekt setzen:
id selWrapper1 = [NSValue valueWithPointer:_cmd];
id selWrapper2 = [NSValue valueWithPointer:@selector(viewDidLoad)];
id selWrapper3 = [NSValue valueWithPointer:@selector(setObject:forKey:)];
NSString *myProperty = @"frame";
NSString *propertySetter = [NSString stringWithFormat:@"set%@%@:",
[[myProperty substringToIndex:1]uppercaseString],
[myProperty substringFromIndex:1]];
id selWrapper4 = [NSValue valueWithPointer:NSSelectorFromString(propertySetter)];
NSArray *array = [NSArray arrayWithObjects:
selWrapper1,
selWrapper2,
selWrapper3,
selWrapper4, nil];
SEL theCmd1 = [[array objectAtIndex:0] pointerValue];
SEL theCmd2 = [[array objectAtIndex:1] pointerValue];
SEL theCmd3 = [[array objectAtIndex:2] pointerValue];
SEL theCmd4 = [[array objectAtIndex:3] pointerValue];