iOS IMP 與 SEL

IMP 官方文檔

指向方法實現(xiàn)開始的指針
id (*IMP)(id, SEL, ...)

// 描述
該數(shù)據(jù)類型是指向?qū)崿F(xiàn)該方法的函數(shù)的開始的指針在讶。
此函數(shù)使用標準C調(diào)用約定作為當前CPU體系結(jié)構(gòu)的實現(xiàn)应结。
第一個參數(shù)是指向self的指針(即該類的特定實例的內(nèi)存莽使,或類方法的指向元類的指針)。
第二個參數(shù)是方法選擇器务傲。

SEL 官方文檔

定義表示方法選擇器的不透明類型
typedef struct objc_selector *SEL;

// 描述
方法選擇器用于在運行時表示方法的名稱。
方法選擇器是一個已在Objective-C運行時注冊(或“映射”)的C字符串 莺琳。
編譯器生成的選擇器在加載類時由運行時自動映射饱岸。
您可以在運行時添加新的選擇器掺出,并使用sel_registerName函數(shù)檢索現(xiàn)有的選擇器 徽千。
使用選擇器時,必須使用sel_registerName或Objective-C編譯器指令@selector()返回的值蛛砰。
不能簡單地將C字符串轉(zhuǎn)換為SE罐栈。

sel_registerName

SEL sel = sel_registerName("test1");
[self performSelector:sel];
- (void)test1
{
    NSLog(@"1");
}
// 打印結(jié)果:1

通過SEL 找到對應的IMP并調(diào)用

SEL sel = @selector(test1);
IMP imp = [self methodForSelector:sel];
    
SEL sel2 = @selector(test4);
IMP imp2 = [self methodForSelector:sel2];
    
objc_msgSend(self,sel,imp);
objc_msgSend(ViewController.class, sel2,imp2);

- (void)test1
{
    NSLog(@"1");
}
+ (void)test4
{
    NSLog(@"4");
}
// 打印結(jié)果為 1 、4

// 使用 objc_msgSend 需添加頭文件 #import <objc/message.h>
// 還有在 Build Settings 中找到 Enable Strict Checking of objc_msgSend Calls 設置為NO

methodForSelector 官方文檔

定位并返回接收方方法實現(xiàn)的地址泥畅,以便將其作為函數(shù)調(diào)用
- (IMP)methodForSelector:(SEL)aSelector;

// aSelector
一個選擇器荠诬,它標識返回實現(xiàn)地址的方法。
選擇器必須是有效且非空的位仁。
如果有疑問柑贞,在將選擇器傳遞給 methodForSelector: 之前,使用respondsToSelector:方法進行檢查聂抢。
// return value
接收者實現(xiàn)選擇器的地址钧嘶。

// Discussion
如果接收方是實例,則aSelector應引用實例方法;
如果接收器是一個類琳疏,它應該引用一個類方法

respondsToSelector 官方文檔

返回一個布爾值有决,該值指示接收類是否響應給定的selector
- (BOOL)respondsToSelector:(SEL)aSelector;

// 返回值
如果接收類響應aSelector消息,則為YES空盼,否則為NO
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末书幕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子揽趾,更是在濱河造成了極大的恐慌台汇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篱瞎,死亡現(xiàn)場離奇詭異苟呐,居然都是意外死亡,警方通過查閱死者的電腦和手機俐筋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門牵素,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澄者,你說我怎么就攤上這事笆呆。” “怎么了闷哆?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長单起。 經(jīng)常有香客問我抱怔,道長,這世上最難降的妖魔是什么嘀倒? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任屈留,我火速辦了婚禮局冰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灌危。我一直安慰自己康二,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布勇蝙。 她就那樣靜靜地躺著沫勿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪味混。 梳的紋絲不亂的頭發(fā)上产雹,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音翁锡,去河邊找鬼蔓挖。 笑死,一個胖子當著我的面吹牛馆衔,可吹牛的內(nèi)容都是我干的瘟判。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼角溃,長吁一口氣:“原來是場噩夢啊……” “哼拷获!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起开镣,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刀诬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邪财,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陕壹,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年树埠,在試婚紗的時候發(fā)現(xiàn)自己被綠了糠馆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡怎憋,死狀恐怖又碌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绊袋,我是刑警寧澤毕匀,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站癌别,受9級特大地震影響皂岔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜展姐,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一躁垛、第九天 我趴在偏房一處隱蔽的房頂上張望剖毯。 院中可真熱鬧,春花似錦教馆、人聲如沸逊谋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胶滋。三九已至,卻和暖如春舒憾,著一層夾襖步出監(jiān)牢的瞬間镀钓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工镀迂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丁溅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓探遵,卻偏偏與公主長得像窟赏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子箱季,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355