3

我正在尝试实现一个调度表,以便可以使用以下示例代码调用选择器:

NSInteger i = 2;
[myObject performSelector:selectors[i]];

我正在尝试存储影响 API 的哪个方法被调用的用户偏好。现在,我使用选择器的字符串名称并使用 NSSelectorFromString,但这有点乱。如果我使用调度表,那么我可以存储一个枚举。

如何在 Objective-C 中创建选择器数组或调度表?

编辑:

当我尝试将选择器数组设置为属性时,编译器会抱怨。@property SEL[]不会编译。

编辑2:

我正在使用我的 KosherCocoa API库,我想根据保存的用户设置一次调用一个方法。我正在保存和读取 Plist 文件。

4

3 回答 3

3

您可以使用该SEL类型来保存选择器。简单地:

SEL dispatchTable[3] = { @selector(doThis:), 
                         @selector(doThat:), 
                         @selector(doTheOther:) 
                       };

对于您的编辑,请使用NSArray/ NSDictionary/etc 的选择器作为您的属性。不允许在 Objective C 中使用 C 数组作为属性;它们不是受支持的类型之一(它们是 ObjC 对象、CF 类型和基本 C 'Plain Old Data' 类型。)

好的,在我们下面的评论中,您需要将选择器包装在 anNSValue中以允许您在 objc 容器中使用它(因为SEL是 C 指针类型):

NSMutableArray * dispatchTable2 = [[NSMutableArray alloc] initWithCapacity:3];
SEL selIn = @selector(doThis:);

// Wrap the selector in an NSValue instance
[dispatchTable2 addObject:[NSValue valueWithPointer:selIn]];

// On extracting:
NSValue * valOut = [dispatchTable2 objectAtIndex:0];
SEL selOut = [[dispatchTable2 objectAtIndex:0] pointerValue];
[anObject performSelector:selOut];

因此,现在您的表是存储为属性或 ivar 的 objc 容器,NSValue您可以使用.SELvalueWithPointer:SELpointerValue

于 2011-12-19T15:07:41.793 回答
2

我建议使用 NSInvocation 而不是选择器。它们更加灵活,因为您可以向许多对象发送相同的调用,并且可以随时更改其属性。

于 2011-12-19T16:17:42.957 回答
1

一种方法是使用数组NSStrings,然后在运行时将它们转换为 SEL,如果这样可以增加您的可读性。

NSString *selectors[] = { ... } 

[myObject performSelector:NSSelectorFromString(selectors[i])];

要将其用作属性,请使用

@property(nonatomic, assign) NSString **selectors;
于 2011-12-19T16:28:27.030 回答