這裏的問題是要綁定這些函數,您必須使用返回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.)
另一種選擇是將命令方法正式化爲協議。這使您可以編寫適用於實現該協議的任何對象的功能,編譯器將提供比僅調用選擇器更多的檢查功能。
E.g.
// some header
@protocol CommandHandler
@required
-(void) handleCommandA;
-(void) handleCommandB;
@end
// some other header
@interface someClass : NSObject<CommandHandler>
{
// you will receive compiler warnings if you do not implement the protocol functions
}
然後,您的處理和調度代碼被寫入與「CommandHandler」類型的對象一起工作。例如
-(void) registerForCommands:(CommandHandler*)handler
我寧願使用字符串代替指針,因爲這將使得調試更加容易。看看NSStringFromSelector()和NSSelectorFromString()。 – jmah 2009-05-17 09:10:39