/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
Class 是一個(gè) objc_class 結(jié)構(gòu)類型的指針
而 id(任意對(duì)象) 是一個(gè) objc_object 結(jié)構(gòu)類型的指針
其第一個(gè)成員是一個(gè) objc_class 結(jié)構(gòu)類型的指針。注意這里有一關(guān)鍵的引申解讀:內(nèi)存布局以一個(gè) objc_class 指針為開始的所有東東都可以當(dāng)做一個(gè) object 來對(duì)待趣兄!
- isa:是一個(gè) objc_class 類型的指針,看到這里,想起我前面的引申解讀了沒姜挺?內(nèi)存布局以一個(gè) objc_class 指針為開始的所有東東都可以當(dāng)做一個(gè) object 來對(duì)待颈将! 這就是說 objc_class 或者說類其實(shí)也可以當(dāng)做一個(gè) objc_object 對(duì)象來對(duì)待倡勇!對(duì)象是對(duì)象,類也是對(duì)象纠俭。
objc發(fā)明了一個(gè)術(shù)語來區(qū)分這兩種不同的對(duì)象:類對(duì)象(class object)與實(shí)例對(duì)象(instance object)。
objc還對(duì)類對(duì)象與實(shí)例對(duì)象中的 isa 所指向的類結(jié)構(gòu)作了不同的命名:類對(duì)象中的 isa 指向類結(jié)構(gòu)被稱作 metaclass浪慌,metaclass 存儲(chǔ)類的static類成員變量與static類成員方法(+開頭的方法)冤荆;實(shí)例對(duì)象中的 isa 指向類結(jié)構(gòu)稱作 class(普通的),class 結(jié)構(gòu)存儲(chǔ)類的普通成員變量與普通成員方法(-開頭的方法)权纤。
在繼承層次中钓简,子類,父類汹想,根類(這些都是普通 class)以及其對(duì)應(yīng)的 metaclass 的 isa 與 super_class 之間關(guān)系:
規(guī)則一:類的實(shí)例對(duì)象的 isa 指向該類外邓;該類的 isa 指向該類的 metaclass;
規(guī)則二:類的 super_class 指向其父類古掏,如果該類為根類則值為 NULL损话;
規(guī)則三:metaclass 的 isa 指向根 metaclass,如果該 metaclass 是根 metaclass 則指向自身;
規(guī)則四:metaclass 的 super_class 指向父 metaclass丧枪,如果該 metaclass 是根 metaclass 則指向該 metaclass 對(duì)應(yīng)的類光涂;
那么 class 與 metaclass 有什么區(qū)別呢?
class 是 instance object 的類類型拧烦。當(dāng)我們向?qū)嵗龑?duì)象發(fā)送消息(實(shí)例方法)時(shí)忘闻,我們?cè)谠搶?shí)例對(duì)象的 class 結(jié)構(gòu)的 methodlists 中去查找響應(yīng)的函數(shù),如果沒找到匹配的響應(yīng)函數(shù)則在該 class 的父類中的 methodlists 去查找(查找鏈為上圖的中間那一排)恋博。如下面的代碼中齐佳,向str 實(shí)例對(duì)象發(fā)送 lowercaseString 消息,會(huì)在 NSString 類結(jié)構(gòu)的 methodlists 中去查找 lowercaseString 的響應(yīng)函數(shù)交播。
NSString * str;
[str lowercaseString];
metaclass 是 class object 的類類型重虑。當(dāng)我們向類對(duì)象發(fā)送消息(類方法)時(shí),我們?cè)谠擃悓?duì)象的 metaclass 結(jié)構(gòu)的 methodlists 中去查找響應(yīng)的函數(shù)秦士,如果沒有找到匹配的響應(yīng)函數(shù)則在該 metaclass 的父類中的 methodlists 去查找(查找鏈為上圖的最右邊那一排)缺厉。如下面的代碼中,向 NSString 類對(duì)象發(fā)送 stringWithString 消息隧土,會(huì)在 NSString 的 metaclass 類結(jié)構(gòu)的 methodlists 中去查找 stringWithString 的響應(yīng)函數(shù)提针。
[NSString stringWithString:@"str"];
轉(zhuǎn)載:http://blog.csdn.net/kesalin/article/details/7211228