如何创建“选择器数组”

我正在使用 iPhone SDK (3.0) ,并尝试创建一个 选择器数组选择器数组来调用一个类中的各种方法。

显然,我做错了一些事情(我认为@selector 不被认为是一个类,因此将它们塞入 NSArray 是不起作用的)。

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

有没有这样一种简单的方法来创建一个选择器数组呢?还是有更好的方法来遍历方法集合?

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;
}
19880 次浏览

Could you store strings and use NSSelectorFromString?

From the docs

NSSelectorFromString

Returns the selector with a given name.

SEL NSSelectorFromString (
NSString *aSelectorName
);

This creates an object out of selector:

[NSValue valueWithPointer:@selector(x)]

Why not just use a simple C array?

static const SEL selectors[] = {@selector(method1),
....
@selector(method7)};


...


for (int i = 0; i < sizeof(selectors)/sizeof(selectors[0]); i++) {
[self performSelector:selectors[i]];
// ....
}

You can also create an array of NSInvocations. This is handy if you need an argument to go with your 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

If the list is static, I'd go with KennyTM's solution, but if you need a dynamic array or set, another option, besides storing the selector string, is to create an object with an SEL property or ivar, and store that.

@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

You could then add a perform method to the class as well, and implement the method call there.

I'd like to supplement two methods of storing selectors in an array,

First, NSPointerArray can store opaque pointer, such as SEL, as Apple doc said,

NSPointerArray *selectors = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsOpaqueMemory];
[selectors addPointer:@selector(onSendButton:)];
[button addTarget: self action:[selectors pointerAt:0] forControlEvents:UIControlEventTouchUpInside];

Second, C-style array is much simpler,

SEL selectors[] = { @selector(onSendButton:) };
[button addTarget: self action:selectors[0] forControlEvents:UIControlEventTouchUpInside];

Choose any as you wish.