如何创建“选择器数组”


82

我正在使用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;
}

Answers:


79

您可以存储字符串并使用NSSelectorFromString吗?

来自文档

NSSelectorFromString

返回具有给定名称的选择器。

SEL NSSelectorFromString (
   NSString *aSelectorName
);

2
当仅需要一个选择器数组时,这不是一个合适的解决方案。
Aleks N. 2012年

1
NSPointerArray更好。
DawnSong


35

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

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

...

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

3
很好,但是static这里不需要(初始化程序不是编译时常量)。
Aleks N. 2012年

12

您还可以创建的数组NSInvocation。如果您需要一个参数与选择器一起使用,这很方便。

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

NSInvocation太昂贵了。
DawnSong

1

如果列表是静态的,我会使用KennyTM的解决方案,但是如果您需要动态数组或集,那么除了存储选择器字符串之外,另一个选择是创建一个带有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向该类添加一个方法,并在该类中实现方法调用。


1

我想补充两种将选择器存储在数组中的方法,

首先,NSPointerArray可以存储不透明的指针,例如SEL,如苹果的文档说,

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

其次,C样式数组要简单得多,

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

根据需要选择任何一个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.