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
”
4. 模擬NSManagedObject