如何创建"选择器阵列"

use*_*146 82 objective-c selector nsarray ios

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

bli*_*sse 79

你能存储字符串并使用NSSelectorFromString吗?

来自文档

NSSelectorFromString
Run Code Online (Sandbox Code Playgroud)

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

SEL NSSelectorFromString (
   NSString *aSelectorName
);
Run Code Online (Sandbox Code Playgroud)

  • 当仅需要一个选择器数组时,这不是一个合适的解决方案。 (2认同)

Den*_*kem 42

这会从选择器中创建一个对象:

[NSValue valueWithPointer:@selector(x)]
Run Code Online (Sandbox Code Playgroud)

  • @DeanKelly在这里回答http://stackoverflow.com/questions/575055/how-to-build-a-nsarray-or-nsmutablearray-of-class-methods-in-objective-c by terry franguiadakis (3认同)
  • 你将如何从这个提取选择器以供`performSelector:`使用? (2认同)

ken*_*ytm 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]];
  // ....
}
Run Code Online (Sandbox Code Playgroud)

  • 很好,但这里不需要`static`(初始化程序不是编译时常量). (3认同)

Mor*_*ess 12

您还可以创建一个NSInvocations 数组.如果你需要一个参数来选择你的选择器,这很方便.

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
Run Code Online (Sandbox Code Playgroud)