SEL和IMP

轉載於:http://www.cnblogs.com/healerkx/archive/2011/12/31/2308932.html

1. SEL和IMP



最早我把SEL理解爲函數指針,現在看來,不是這樣的。


1.1 SEL類型


SEL類型的變量,可以通過@selector(方法名)來取得,當然了,Objective C的方法名,我們也知道了,多麼噁心(比Java廢話還多)。


而它真正得到的,只要方法名一樣,它的值就是一樣的,不管這個方法定義於哪個類,是不是實例方法【再說了,@selector的時候,除了方法名也沒有什麼類啊,對象啊什麼事情】。


所以我現在把它理解爲“方法名的某種映射結果”。(從C++程序員的眼光看,我覺得沒啥可以對應的,既不是函數指針,也不是函數指針類型,像是函數指針類型的名字吧。)


1.2 IMP類型


這個纔是函數指針,IMP可以從 對象 & SEL的方法得到:


IMP imp = [self methodForSelector:selector];
這是IMP的定義:


typedef id (*IMP)(id, SEL, );


另外注意NSObject裏面的這兩個方法:


- (IMP)methodForSelector:(SEL)aSelector;
+ (IMP)instanceMethodForSelector:(SEL)aSelector;
 


2. Objective C可以動態添加方法...


class_addMethod,用就行了,轉到定義,可以看看其他的方法,也很動態(這也太動態了,Java,C#也不行啊)。


"定義於runtime.h"


 


3. resolveInstanceMethod


這個方法挺BT的。



我暫時個人理解爲方法劫持吧,方法和屬性的調用,都會先跑到這裏來,具體看文檔吧:
http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/chapter_5_section_2.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章