SEL : 類成員方法的指針,但不同于C語言中的函數指針,函數指針直接保存了方法的地址,但SEL只是方法編號。
IMP:一個函數指針,保存了方法的地址
IMP和SEL關系
每一個繼承于NSObject的類都能自動獲得runtime的支持。在這樣的一個類中,有一個isa指針,指向該類定義的數據結構體,這個結構體是由編譯器編譯時為類(需繼承于NSObject)創建的.在這個結構體中有包括了指向其父類類定義的指針以及 Dispatch table. Dispatch table是一張SEL和IMP的對應表。(http://blog.csdn.net/fengsh998/article/details/8614486)
也就是說方法編號SEL最后還是要通過Dispatch table表尋找到對應的IMP,IMP就是一個函數指針,然后執行這個方法
Q1:有什么辦法可以知道方法編號呢
@selector()就是取類方法的編號。
SEL methodId=@selector(func1);
Q2:編號獲取后怎么執行對應方法呢
[self performSelector:methodIdwithObject:nil];
Q3:有沒有辦法通過編號獲取方法
NSString*methodName = NSStringFromSelector(methodId);
Q4:IMP怎么獲得和使用
IMP methodPoint = [self methodForSelector:methodId];
methodPoint();
Q5:為什么不直接獲得函數指針,而要從SEL這個編號走一圈再回到函數指針呢?
有了SEL這個中間過程,我們可以對一個編號和什么方法映射做些操作,也就是說我們可以一個SEL指向不同的函數指針,這樣就可以完成一個方法名在不同時候執行不同的函數體。另外可以將SEL作為參數傳遞給不同的類執行。也就是說我們某些業務我們只知道方法名但需要根據不同的情況讓不同類執行的時候,SEL可以幫助我們。其他SEL的好處可以在評論中幫忙補充...