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ǔ)充...