我正在尝试实现一个调度表,以便我可以使用以下示例代码调用选择器:
NSInteger i = 2;
[myObject performSelector:selectors[i]];
我正在尝试存储影响API调用方法的用户首选项。现在,我使用选择器的字符串名称并使用NSSelectorFromString,但这有点乱。如果我使用调度表,那么我可以存储枚举。
如何在Objective-C中创建一个选择器数组或一个调度表?
修改
当我尝试将选择器数组设置为属性时,编译器会抱怨。 @property SEL[]
将无法编译。
EDIT2:
我正在使用my KosherCocoa API库,我希望根据保存的用户设置立即调用单个方法。我正在保存并读取Plist文件。
答案 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容器,你使用NSValue
用SEL
包裹valueWithPointer:
指针并获取SEL
pointerValue
。
答案 1 :(得分:2)
我建议使用NSInvocation而不是选择器。它们更加灵活,因为您可以将相同的调用发送到许多对象,并且可以随时更改其属性。
答案 2 :(得分:1)
执行此操作的一种方法是使用NSStrings
数组,然后在运行时将这些数组转换为SEL,如果这样可以提高您的可读性..
NSString *selectors[] = { ... }
[myObject performSelector:NSSelectorFromString(selectors[i])];
要将此作为属性使用,请使用
@property(nonatomic, assign) NSString **selectors;