2011/05/05

Objective-c Selector (SEL)與函式指標(IMP)

可以在執行期動態指定要執行的方法

簡單的使用如下
SEL pSel = @selector(noParamMethod);
SEL pSel2 = @selector(threeParamMethod:::);
TestObj * testObj1 = [[[TestObj alloc]init]autorelease];
TestObj * testObj2 = [[[TestObj alloc]init]autorelease];

經由Selector(在這裡有個限制是Selector只能給兩個參數)
[testObj1 performSelector:pSel2 withObject:1 withObject:2];
[testObj1 performSelector:pSel];

經由函式指標
IMP pFun2 = [testObj2 methodForSelector:pSel2];
pFun2(testObj2, pSel2, 123);
IMP pFun = [testObj2 methodForSelector:pSel];
pFun(testObj2, pSel);

有幾個得到selector的方法
SEL x = @selector(method)
SEL x = NSSelectorFromString(NSString)
上面的NSString格式大概如右:setSkinColor -> SET_SKIN_COLOR

經由
+(BOOL) instancesRespondToSelector:selector
-(BOOL) respondToSelector
可以檢查類別或實體是否能回應selector指定的方法

以一個類別TestObj有兩個方法
-(void)  noParamMethod;
-(void)  threeParamMethod:(int)a :(int)b :(int)c;

可以經由給予SEL取得指定方法的IMP
-(IMP) methodForSelector:(SEL) aSelector
+(IMP) instancemethodForSelector:(SEL) aSelector


比較好的函數指標使用例子是cocos2d的schedule機制,經過呼叫schedule給SEL後紀錄函式指標並在timer update時回call並給時差參數

另外這裡有一篇還不錯的文章
http://www.cnblogs.com/yaski/archive/2009/04/05/1429735.html

沒有留言 :