如何创build一个“数组select器”

我正在使用iPhone SDK(3.0),我试图创build一个select器数组来调用一个类中的各种方法。

很显然,我做错了什么(我认为@select器不被认为是一个类,所以填充到一个NSArray不起作用)。

我试过了,但显然是错的。

有一个简单的方法有这样的select器数组? 还是有更好的方法来遍历一组方法?

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

你可以存储string,并使用NSSelectorFromString?

从文档

 NSSelectorFromString 

返回给定名称的select器。

 SEL NSSelectorFromString ( NSString *aSelectorName ); 

这会在select器之外创build一个对象:

 [NSValue valueWithPointer:@selector(x)] 

为什么不使用简单的C数组?

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

你也可以创build一个NSInvocation数组。 如果你需要一个参数去select器,这是很方便的。

 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 

如果列表是静态的,我会用KennyTM的解决scheme,但是如果你需要一个dynamic数组或者集合,除了存储select器string之外,另一个选项是创build一个SEL属性或者ivar的对象并存储它。

 @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 

然后你可以在类中添加一个perform方法,并在那里实现方法调用。