iOS中的SEl和IMP到底是什么

SEL : 類成員方法的指針,但不同于C語(yǔ)言中的函數(shù)指針,函數(shù)指針直接保存了方法的地址,但SEL只是方法編號(hào)。

IMP:一個(gè)函數(shù)指針,保存了方法的地址

IMP和SEL關(guān)系

每一個(gè)繼承于NSObject的類都能自動(dòng)獲得runtime的支持。在這樣的一個(gè)類中,有一個(gè)isa指針,指向該類定義的數(shù)據(jù)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體是由編譯器編譯時(shí)為類(需繼承于NSObject)創(chuàng)建的.在這個(gè)結(jié)構(gòu)體中有包括了指向其父類類定義的指針以及 Dispatch table. Dispatch table是一張SEL和IMP的對(duì)應(yīng)表。(http://blog.csdn.net/fengsh998/article/details/8614486)

也就是說方法編號(hào)SEL最后還是要通過Dispatch table表尋找到對(duì)應(yīng)的IMP,IMP就是一個(gè)函數(shù)指針,然后執(zhí)行這個(gè)方法

Q1:有什么辦法可以知道方法編號(hào)呢

@selector()就是取類方法的編號(hào)。

SEL methodId=@selector(func1);

Q2:編號(hào)獲取后怎么執(zhí)行對(duì)應(yīng)方法呢

[self performSelector:methodIdwithObject:nil];

Q3:有沒有辦法通過編號(hào)獲取方法

NSString*methodName = NSStringFromSelector(methodId);

Q4:IMP怎么獲得和使用

IMP methodPoint = [self methodForSelector:methodId];

methodPoint();

Q5:為什么不直接獲得函數(shù)指針,而要從SEL這個(gè)編號(hào)走一圈再回到函數(shù)指針呢?

有了SEL這個(gè)中間過程,我們可以對(duì)一個(gè)編號(hào)和什么方法映射做些操作,也就是說我們可以一個(gè)SEL指向不同的函數(shù)指針,這樣就可以完成一個(gè)方法名在不同時(shí)候執(zhí)行不同的函數(shù)體。另外可以將SEL作為參數(shù)傳遞給不同的類執(zhí)行。也就是說我們某些業(yè)務(wù)我們只知道方法名但需要根據(jù)不同的情況讓不同類執(zhí)行的時(shí)候,SEL可以幫助我們。其他SEL的好處可以在評(píng)論中幫忙補(bǔ)充...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • SEL : 類成員方法的指針,但不同于C語(yǔ)言中的函數(shù)指針,函數(shù)指針直接保存了方法的地址,但SEL只是方法編號(hào)。 I...
    sunmumu1222閱讀 314評(píng)論 0 0
  • SEL : 類成員方法的指針,但不同于C語(yǔ)言中的函數(shù)指針,函數(shù)指針直接保存了方法的地址,但SEL只是方法編號(hào)。IM...
    金歌漫舞閱讀 665評(píng)論 0 2
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,030評(píng)論 0 9
  • 把網(wǎng)上的一些結(jié)合自己面試時(shí)遇到的面試題總結(jié)了一下,以后有新的還會(huì)再加進(jìn)來。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,657評(píng)論 0 20
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,584評(píng)論 0 6

友情鏈接更多精彩內(nèi)容