这里的问题是,要绑定这些函数,您必须使用返回SEL类型的selector关键字.这是指针类型,而NSArray存储对象.
你有三个选择;
使用常规的C型数组
将函数折叠到一个将调用它们的NSObject派生类中.
使用协议.
第二个可能更好,为此您可以使用NSValue类来保存选择器结果.例如;
NSValue* selCommandA = [NSValue valueWithPointer:@selector(handleCommandA:)]; NSValue* selCommandB = [NSValue valueWithPointer:@selector(handleCommandB:)]; NSArray *handler_table = [NSArray arrayWithObjects:selCommandA, selCommandB, nil ];
当您从阵列中检索到正确的条目时,要转换回来,您会这样做;
SEL mySelector = [selCommand pointerValue]; [someObject performSelector:mySelector];
(注意我假设你的objective-c语法中的这些用作对象的方法,而不是全局函数.如果你想在全局使用它们,那么你应该像在C中那样编写它们.)
另一种选择是将命令方法形式化为协议.这允许您编写可以在任何实现该协议的对象上工作的功能,并且编译器将提供比您只是调用选择器更多的检查.
例如
// some header @protocol CommandHandler @required -(void) handleCommandA; -(void) handleCommandB; @end // some other header @interface someClass : NSObject{ // you will receive compiler warnings if you do not implement the protocol functions }
然后编写处理和调度代码以使用"CommandHandler"类型的对象.例如
-(void) registerForCommands:(CommandHandler*)handler
使用NSValue.
例如:
NSArray* handlers = [NSArray arrayWithObjects:[NSValue valueWithPointer:handleA] ... ];
然后访问:
handleptr* handle = (handlerptr*)[[handlers objectAtIndex:0] pointerValue]; handle(foo_bar);