Je souhaite ajouter des sélecteurs à un NSMutableArray. Mais puisque ce sont des types opaques et pas d'objets, ça ne marcherait pas, n'est-ce pas? Y a-t-il un objet wrapper que je peux utiliser? Ou dois-je créer le mien?Y a-t-il un objet wrapper pour SEL?
4
A
Répondre
5
Vous pouvez mémoriser le nom NSString du sélecteur dans le tableau et utiliser
SEL mySelector = NSSelectorFromString([selectorArray objectAtIndex:0]);
pour générer le sélecteur de la chaîne stockée.
De plus, vous pouvez emballer le sélecteur comme NSInvocation en utilisant quelque chose comme
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:mySelector]];
[invocation setTarget:self];
[invocation setSelector:mySelector];
[invocation setArgument:&arg atIndex:2];
[invocation retainArguments];
Cet objet NSInvocation peut alors être stocké dans le tableau et a invoqué plus tard.
9
Vous pouvez envelopper dans une instance NSValue
comme suit:
SEL mySelector = @selector(performSomething:);
NSValue *value = [NSValue value:&mySelector withObjCType:@encode(SEL)];
puis ajouter de la valeur à votre instance NSMutableArray
.
2
NSValue valueWithPointer/pointerValue fonctionne tout aussi bien. Vous avez juste besoin de savoir que vous ne pouvez pas sérialiser le tableau (c'est-à-dire l'écrire dans un fichier) si vous voulez faire cela, utilisez l'approche NSStringFromSelector.
ce sont autant de façons de mettre un sélecteur dans un objet NSValue:
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];
Intéressant - J'ai jamais utilisé NSInvocation - merci! –