這個(gè)方法是獲取某個(gè)SEL的IMP
問題來了攀芯,什么是SEL,什么是IMP解孙?
1. SEL
Objective-C是動(dòng)態(tài)語言萎馅,動(dòng)態(tài)體現(xiàn)在可以在運(yùn)行的時(shí)候修改所執(zhí)行的方法喇喉,可以把一個(gè)對(duì)象的所有方法看成一張表,SEL就可以看成表中每一條的索引校坑,根據(jù)方法名來生成對(duì)應(yīng)的SEL,所以O(shè)C中不同的方法名就對(duì)應(yīng)不同的方法
SEL1 | SEL2 | SEL3 | ... |
---|---|---|---|
IMP1 | IMP2 | IMP3 | ... |
2. IMP
IMP是真正的函數(shù)指針,這是其定義
typedef id (*IMP)(id, SEL,... );
它指向一個(gè)真正的函數(shù)地址
我們借助- (IMP)methodForSelector:(SEL)aSelector
來證明這一點(diǎn)
3. - (IMP)methodForSelector:(SEL)aSelector
這個(gè)方法可以根據(jù)一個(gè)SEL千诬,得到該方法的IMP(函數(shù)指針)
假設(shè):如果返回的是個(gè)函數(shù)指針耍目,那么我們應(yīng)該能夠直接使用imp();進(jìn)行調(diào)用。
實(shí)驗(yàn):
- (void)viewDidLoad {
[super viewDidLoad];
IMP imp = [self methodForSelector:@selector(sayHi)];
imp();
}
- (void)sayHi {
NSLog(@"hello world");
}
控制臺(tái)打有彀蟆:
2015-09-28 09:51:13.132 MethodForSelector[755:215807] hello world
需要注意的是
- (IMP)methodForSelector:(SEL)aSelector
參數(shù)aSelector即使是私有方法邪驮,即在.h文件中沒有暴露接口也會(huì)調(diào)用成功
4. + (IMP)instanceMethodForSelector:(SEL)aSelector
這個(gè)方法是個(gè)類方法,返回的是該方法(aSelector)的真正的函數(shù)地址
總結(jié):
- SEL是索引
- IMP是真正的函數(shù)
- 既然我們SEL和IMP是映射關(guān)系傲茄,那么我們就可以改變這個(gè)映射關(guān)系毅访,method swizzle,就是這個(gè)原理