SEL:類成員方法的指針。(不同于C語言中的函數指針,函數指針直接保存了方法的地址,SEL只是方法編號)
IMP:一個函數指針,保存了方法的地址。
IMP和SEL關系:
每一個繼承于NSObject的類都能自動獲得runtime的支持。在這樣的一個類中,有一個isa指針,指向該類定義的數據結構體,這個結構體是由編譯器編譯時為類(需繼承于NSObject)創建的。在這個結構體中又包括指向其父類類定義的指針以及Dispatch table.Dispatch table是一張SEL和IMP的對應表。也就是說方法編號SEL最后還是要通過Dispatch table表尋找對應的IMP,IMP就是一個函數指針,然后執行這個方法。
SEL相關問題:
通過@selector()可以取到類方法的編號。 SEL methodId = @selector(func1);
獲取編號后如何執行對應方法:[self performSelector:methodIdWithObject:nil];
通過編號獲取方法:NSString *methodName = NSStringFromSelector(methodId);
IMP相關問題:
獲得:IMP methodPoint = [self methodForSelector:methodId];
methodPoint();
為什么不直接獲得函數指針,而要從SEL這個編號走一圈再回到函數指針呢?
有了SEL這個中間過程,我們可以對一個編號和什么方法映射做些操作,也就是說我們可以一個SEL指向不同的函數指針,這樣就可以完成一個方法名在不同時候執行不同的函數體。另外可以將SEL作為參數傳遞給不同的類執行。?
isa:字面意思就是 is a? ,是一個什么。