OC實(shí)例、類、元類

首先看一下類的數(shù)據(jù)結(jié)構(gòu):
class_數(shù)據(jù)結(jié)構(gòu).png

Objective-C中的對(duì)象,主要可以分為3種
instance對(duì)象(實(shí)例對(duì)象)
class對(duì)象(類對(duì)象)
meta-class對(duì)象(元類對(duì)象)

        // instance對(duì)象,實(shí)例對(duì)象
        NSObject *object1 = [[NSObject alloc] init];
        NSObject *object2 = [[NSObject alloc] init];
        
        // class對(duì)象,類對(duì)象
        // class方法返回的一直是class對(duì)象,類對(duì)象
        Class objectClass1 = [object1 class];
        Class objectClass2 = [object2 class];
        Class objectClass3 = object_getClass(object1);
        Class objectClass4 = object_getClass(object2);
        Class objectClass5 = [NSObject class];
        
        // meta-class對(duì)象,元類對(duì)象
        //元類對(duì)象只能通過object_getClass獲取,參數(shù)必須是類對(duì)象
        Class objectMetaClass = object_getClass(objectClass1);
        
        //獲取到的還是類對(duì)象
//        Class objectMetaClass2 = [[[NSObject class] class] class];
        
        NSLog(@"instance - %p %p",
              object1,
              object2);
        
        NSLog(@"class - %p %p %p %p %p %d",
              objectClass1,
              objectClass2,
              objectClass3,
              objectClass4,
              objectClass5,
              class_isMetaClass(objectClass1));
        
        NSLog(@"objectMetaClass - %p %d", objectMetaClass, class_isMetaClass(objectMetaClass));

結(jié)果如下:
 instance - 0x100547320 0x100544c90
 class - 0x7fff805fb388 0x7fff805fb388 0x7fff805fb388 0x7fff805fb388 0x7fff805fb388 0
 objectMetaClass - 0x7fff805fb360 1

一.實(shí)例對(duì)象

object1、object2為實(shí)例對(duì)象,每個(gè)實(shí)例對(duì)象內(nèi)存地址是不一樣的,內(nèi)部存儲(chǔ)信息主要包括:
1.isa
2.其他成員變量(ivar)
3.其他成員屬性(最終還是成員變量)

二.類對(duì)象

objectClass1 ~ objectClass5都是NSObject的class對(duì)象(類對(duì)象)

它們是同一個(gè)對(duì)象。每個(gè)類在內(nèi)存中有且只有一個(gè)class對(duì)象

class對(duì)象在內(nèi)存中存儲(chǔ)的信息主要包括:
1.isa指針
2.superclass指針
3.類的屬性信息(@property)
4.類的對(duì)象方法信息(instance method)
5.類的協(xié)議信息(protocol)
6.類的成員變量信息(ivar)
7....

三.元類對(duì)象

meta-class對(duì)象,元類對(duì)象
元類對(duì)象只能通過object_getClass獲取,參數(shù)必須為類對(duì)象

      Class objectMetaClass = object_getClass(objectClass1);

Class objectMetaClass2 = [[[NSObject class] class] class];獲取的還是類對(duì)象

objectMetaClass是NSObject的meta-class對(duì)象(元類對(duì)象)

每個(gè)類在內(nèi)存中有且只有一個(gè)meta-class對(duì)象

meta-class對(duì)象和class對(duì)象的內(nèi)存結(jié)構(gòu)是一樣的,但是用途不一樣,在內(nèi)存中存儲(chǔ)的信息主要包括
1.isa指針
2.superclass指針
3.類的類方法信息(class method)
4....

方法class_isMetaClass()可以用來判斷是否是元類對(duì)象

 1.Class objc_getClass(const char *aClassName)
 1> aClassName 類名必須是字符串
 2> 返回對(duì)應(yīng)的類對(duì)象
 
 2.Class object_getClass(id obj)
 1> 傳入的obj可能是instance對(duì)象、class對(duì)象、meta-class對(duì)象
 2> 返回值
 a) 如果是instance對(duì)象,返回class對(duì)象
 b) 如果是class對(duì)象,返回meta-class對(duì)象
 c) 如果是meta-class對(duì)象,返回NSObject(基類)的meta-class對(duì)象
 
 3.- (Class)class、+ (Class)class
 1> 返回的就是類對(duì)象
 
 - (Class) {
     return self->isa;
 }
 
 + (Class) {
     return self;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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