類中定義的方法通常是以函數(shù)形式實(shí)現(xiàn)的胜嗓,但通常在編程的時候并不會直接操作方法對應(yīng)對函數(shù)。
如果想讓程序更快一點(diǎn)次坡,可以通過函數(shù)指針的方式調(diào)用方法呼猪。(提升了速度,但失去了面向?qū)ο蟮膭討B(tài)綁定贸毕、多態(tài)的特性)
IMP?類型
IMP是“implementation”的縮寫郑叠,是一個函數(shù)指針,指向了方法實(shí)現(xiàn)代碼的入口明棍。
IMP定義為
typedef id (*IMP)(id,SEL,..);
獲得函數(shù)指針的方法
?- ?(IMP)methodForSelector: (SEL) aSelector
搜索和指定選擇器對應(yīng)的方法乡革,并返回指向方法實(shí)現(xiàn)的指針。實(shí)例對象和類對象都可以使用這個方法摊腋。
?+ (IMP)instanceMethodForSelector: (SEL)aSelector
搜索和指定選擇器對應(yīng)的實(shí)例方法沸版,并返回指向方法實(shí)現(xiàn)的指針。
用法
設(shè)有以下一個方法
- (id)setBox: (id)obj1 title: (id)obj2;
我們通過以下代碼實(shí)現(xiàn)調(diào)用
IMP funcp;
//設(shè)foo為實(shí)例變量兴蒸,函數(shù)調(diào)用方法為[fool setBox:obj1 title:obj2];? 视粮,但下處使用foo的實(shí)例方法返回函數(shù)指針從而調(diào)用函數(shù)setBox: title
funcp = [foo methodForSelector:@selector (setBox:title:)];
xyz = (*funcp)(foo,@selector(setBox:title:),param1,param2);
從以上代碼可知,通過函數(shù)指針調(diào)用的方式其實(shí)含有兩個 隱含參數(shù) 橙凳。 第一個為self蕾殴,第二個為選擇器(可以通過_cmd變量來訪問)。
內(nèi)容引自《Objective-C編程全解》- [日]