iphone objective-c nsarray selector

iphone - cómo crear una "matriz de selectores"



objective-c nsarray (5)

¿Podría almacenar cadenas y usar NSSelectorFromString?

De los docs

NSSelectorFromString

Devuelve el selector con un nombre de pila.

SEL NSSelectorFromString ( NSString *aSelectorName );

Estoy usando el iPhone SDK (3.0) y estoy tratando de crear una matriz de selectores para invocar una variedad de métodos dentro de una misma clase.

Obviamente, estoy haciendo algo mal (creo que @selector no se considera una clase y, por lo tanto, rellenarlos en un NSArray no está funcionando).

Intenté esto, pero obviamente está mal.

¿Hay una manera simple de tener una variedad de selectores como este? ¿O hay una mejor manera de iterar a través de una colección de métodos?

selectors = [NSArray arrayWithObjects: @selector(method1), @selector(method2), @selector(method3), @selector(method4), @selector(method5), @selector(method6), @selector(method7), nil]; for (int i = 0; i < [selectors count]; i++) { if ([self performSelector:[selectors objectAtIndex:i]]) // do stuff; }


¿Por qué no simplemente usar una simple matriz C?

static const SEL selectors[] = {@selector(method1), .... @selector(method7)}; ... for (int i = 0; i < sizeof(selectors)/sizeof(selectors[0]); i++) { [self performSelector:selectors[i]]; // .... }


Esto crea un objeto fuera del selector:

[NSValue valueWithPointer:@selector(x)]


Si la lista es estática, iría con la solución de KennyTM, pero si necesita una matriz o conjunto dinámico, otra opción, además de almacenar la cadena del selector, es crear un objeto con una propiedad SEL o ivar, y almacenar eso.

@interface SelectorObject : NSObject @property (assign, readonly, nonatomic) SEL selector; - (id)initWithSelector:(SEL)selector; @end @implementation SelectorObject - (id)initWithSelector:(SEL)selector { self = [super init]; if (self) { _selector = selector; } return self; } @end

Luego, podría agregar un método de perform a la clase e implementar la llamada al método allí.


También puede crear una matriz de NSInvocation s. Esto es útil si necesita un argumento para ir con su selector.

NSMethodSignature *sig = [[yourTarget class] instanceMethodSignatureForSelector:yourSEL]; NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig]; [inv setTarget:yourTarget]; [inv setSelector:yourSEL]; [inv setArgument:&yourObject atIndex:2]; // Address of your object