SEl和IMP

一,SEl和IMP到底是什么

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

IMP和SEL關系

每一個繼承于NSObject的類都能自動獲得runtime的支持。在這樣的一個類中,有一個isa指針,指向該類定義的數(shù)據(jù)結(jié)構(gòu)體,這個結(jié)構(gòu)體是由編譯器編譯時為類(需繼承于NSObject)創(chuàng)建的.在這個結(jié)構(gòu)體中有包括了指向其父類類定義的指針以及 Dispatch table. Dispatch table是一張SEL和IMP的對應表。也就是說方法編號SEL最后還是要通過Dispatch table表尋找到對應的IMP,IMP就是一個函數(shù)指針,然后執(zhí)行這個方法

1)通過方法獲得方法的編號:SEL methodId=@selector(methodName);或者SEL methodId = NSSelectorFromString(methodName);

2)通過方法編號執(zhí)行該編號的方法: [self performSelector:methodId withObject:nil];

3)通過方法編號獲取該編號的方法名 NSString*methodName = NSStringFromSelector(methodId);

4)通過方法編號獲得IMP IMP methodPoint = [self methodForSelector:methodId];

5)執(zhí)行IMP void (*func)(id, SEL, id) = (void *)imp; func(self, methodName,param);

注意分析:如果方法沒有傳入?yún)?shù)時:void (*func)(id, SEL) = (void *)imp; func(self, methodName);

如果方法傳入一個參數(shù)時:void (*func)(id, SEL,id) = (void *)imp; func(self, methodName,param);

如果方法傳入倆個參數(shù)時:void (*func)(id, SEL,id,id) = (void *)imp; func(self, methodName,param1,param2);

參考以下文獻:
文獻

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

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,058評論 0 9
  • SEL SEL是選擇器(selector)的一個類型。選擇器就是指向方法的一個指針, OC在編譯的時候,會根據(jù)方法...
    Ahri阿貍閱讀 1,826評論 1 1
  • SEL : 類成員方法的指針,但不同于C語言中的函數(shù)指針,函數(shù)指針直接保存了方法的地址,但SEL只是方法編號。 I...
    此頁空白閱讀 335評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,658評論 1 32
  • SEL : 類成員方法的指針,但不同于C語言中的函數(shù)指針,函數(shù)指針直接保存了方法的地址,但SEL只是方法編號。 I...
    壯了個壯閱讀 28,245評論 9 98

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