2009-05-29 3 views
4

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?

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.

+0

Intéressant - J'ai jamais utilisé NSInvocation - merci! –

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];