Cocoa之類與對象

/// 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(任意對象) 是一個(gè) objc_object 結(jié)構(gòu)類型的指針

其第一個(gè)成員是一個(gè) objc_class 結(jié)構(gòu)類型的指針。注意這里有一關(guān)鍵的引申解讀:內(nèi)存布局以一個(gè) objc_class 指針為開始的所有東東都可以當(dāng)做一個(gè) object 來對待!

  • isa:是一個(gè) objc_class 類型的指針,看到這里,想起我前面的引申解讀了沒?內(nèi)存布局以一個(gè) objc_class 指針為開始的所有東東都可以當(dāng)做一個(gè) object 來對待! 這就是說 objc_class 或者說類其實(shí)也可以當(dāng)做一個(gè) objc_object 對象來對待!對象是對象,類也是對象。

objc發(fā)明了一個(gè)術(shù)語來區(qū)分這兩種不同的對象:類對象(class object)與實(shí)例對象(instance object)。

objc還對類對象與實(shí)例對象中的 isa 所指向的類結(jié)構(gòu)作了不同的命名:類對象中的 isa 指向類結(jié)構(gòu)被稱作 metaclass,metaclass 存儲類的static類成員變量與static類成員方法(+開頭的方法);實(shí)例對象中的 isa 指向類結(jié)構(gòu)稱作 class(普通的),class 結(jié)構(gòu)存儲類的普通成員變量與普通成員方法(-開頭的方法)。

在繼承層次中,子類,父類,根類(這些都是普通 class)以及其對應(yīng)的 metaclass 的 isa 與 super_class 之間關(guān)系:

規(guī)則一:類的實(shí)例對象的 isa 指向該類;該類的 isa 指向該類的 metaclass;
規(guī)則二:類的 super_class 指向其父類,如果該類為根類則值為 NULL;
規(guī)則三:metaclass 的 isa 指向根 metaclass,如果該 metaclass 是根 metaclass 則指向自身;
規(guī)則四:metaclass 的 super_class 指向父 metaclass,如果該 metaclass 是根 metaclass 則指向該 metaclass 對應(yīng)的類;

objc_class_object_relation.png

那么 class 與 metaclass 有什么區(qū)別呢?
class 是 instance object 的類類型。當(dāng)我們向?qū)嵗龑ο蟀l(fā)送消息(實(shí)例方法)時(shí),我們在該實(shí)例對象的 class 結(jié)構(gòu)的 methodlists 中去查找響應(yīng)的函數(shù),如果沒找到匹配的響應(yīng)函數(shù)則在該 class 的父類中的 methodlists 去查找(查找鏈為上圖的中間那一排)。如下面的代碼中,向str 實(shí)例對象發(fā)送 lowercaseString 消息,會在 NSString 類結(jié)構(gòu)的 methodlists 中去查找 lowercaseString 的響應(yīng)函數(shù)。

NSString * str;
[str lowercaseString];

metaclass 是 class object 的類類型。當(dāng)我們向類對象發(fā)送消息(類方法)時(shí),我們在該類對象的 metaclass 結(jié)構(gòu)的 methodlists 中去查找響應(yīng)的函數(shù),如果沒有找到匹配的響應(yīng)函數(shù)則在該 metaclass 的父類中的 methodlists 去查找(查找鏈為上圖的最右邊那一排)。如下面的代碼中,向 NSString 類對象發(fā)送 stringWithString 消息,會在 NSString 的 metaclass 類結(jié)構(gòu)的 methodlists 中去查找 stringWithString 的響應(yīng)函數(shù)。

[NSString stringWithString:@"str"];

轉(zhuǎn)載:http://blog.csdn.net/kesalin/article/details/7211228

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容