在Objective-C中实现Dispatch表:如何声明一个选择器数组

时间:2011-12-19 15:04:01

标签: objective-c dispatch dispatch-table

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

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

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

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

修改

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

EDIT2:

我正在使用my KosherCocoa API库,我希望根据保存的用户设置立即调用单个方法。我正在保存并读取Plist文件。

3 个答案:

答案 0 :(得分:3)

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

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

要进行修改,请使用NSArray / NSDictionary /等选择器作为您的财产。您不能在目标C中使用C数组作为属性;它们不是受支持的类型之一(ObjC对象,CF类型和基本C'普通旧数据'类型。)

好的,在下面的评论中,您需要将选择器包装在NSValue中以允许您在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容器,你使用NSValueSEL包裹valueWithPointer:指针并获取SEL pointerValue

答案 1 :(得分:2)

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

答案 2 :(得分:1)

执行此操作的一种方法是使用NSStrings数组,然后在运行时将这些数组转换为SEL,如果这样可以提高您的可读性..

NSString *selectors[] = { ... } 

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

要将此作为属性使用,请使用

@property(nonatomic, assign) NSString **selectors;