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