運(yùn)用IMP指針渡贾,IMP就是Implementation的縮寫逗宜,顧名思義,它是指向一個方法實現(xiàn)的指針空骚,每一個方法都有一個對應(yīng)的IMP锦溪,所以,我們可以直接調(diào)用方法的IMP指針府怯,來避免方法調(diào)用死循環(huán)的問題刻诊。
調(diào)用一個IMP的方式和調(diào)用普通C函數(shù)相同,比如:
id returnObjc = someIMP(objc,SEL,params...);
不過如果你的項目沒有做其他配置的話這樣調(diào)用編譯器是不會通過的牺丙,我們來看一下先它的定義:
if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ );
else
typedef id (*IMP)(id, SEL, ...);
endif
在默認(rèn)情況下你的工程是打開這個配置的
這種情況下IMP被定義為無參數(shù)無返回值的函數(shù)则涯。所以你需要到工程里搜索到這個選項并把它關(guān)閉。這樣的麻煩就是冲簿,每次使用粟判,你都需要修改工程配置,所以這里我再介紹另外一種辦法:重新定義一個和有參數(shù)的IMP指針相同的指針類型峦剔,在獲取IMP時把它強(qiáng)轉(zhuǎn)為此類型档礁。這樣運(yùn)用IMP指針后,就不需要額外的給ViewController寫新的方法
值得注意的是吝沫,如果你重寫的方法有返回值呻澜,不要忘記在最后做return递礼。
總結(jié)
實際上直接調(diào)用一個方法的IMP指針的效率是高于調(diào)用方法本身的,所以羹幸,如果你有一個合適的時機(jī)獲取到方法的IMP的話脊髓,你可以試著調(diào)用它。