iOS底層原理總結(jié) - OC對(duì)象的分類

iOS底層原理總結(jié) - OC對(duì)象的分類

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

一、instance

  • instance對(duì)象就是通過(guò)類alloc出來(lái)的對(duì)象, 每次調(diào)用alloc都會(huì)產(chǎn)生新的instance對(duì)象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

NSLog(@"obj1 - %p", obj1);      // 打印: obj1 - 0x100500e90
NSLog(@"obj2 - %p", obj2);      // 打印: obj2 - 0x1005061b0
  • obj1、obj2NSObjectinstance對(duì)象(實(shí)例對(duì)象), 它們是不同的兩個(gè)對(duì)象,分別占據(jù)著兩塊不同的內(nèi)存

  • instance對(duì)象在內(nèi)存中存儲(chǔ)的信息包括

    • isa指針
    • 其他成員變量
  • 例如, 一個(gè)Person類, 繼承自NSObject, 有一個(gè)_age的成員變量

@interface Person: NSObject {
    @public
    int _age;
}
@end
@implementation Person
@end
  • 創(chuàng)建Person類的instance對(duì)象, 并給成員變量_age賦值
Person *p1 = [[Person alloc] init];
p1->_age = 3

Person *p2 = [[Person alloc] init];
p2->_age = 4
  • 因?yàn)?code>p1和p2是兩個(gè)alloc創(chuàng)建的對(duì)象, 所以在內(nèi)存中分別占用一塊內(nèi)存, 類似于下圖
image.png

二、class

  • class類對(duì)象, 可以通過(guò)alloc創(chuàng)建出instance對(duì)象
  • 有三種方式, 可以獲取一個(gè)類對(duì)象
    • - (Class)class
    • + (Class)class
    • object_getClass(實(shí)例對(duì)象)
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
// - (Class)class
Class objectClass1 = [obj1 class];
Class objectClass2 = [obj2 class];
// + (Class)class
Class objectClass3 = [NSObject class];
// object_getClass(實(shí)例對(duì)象)
Class objectClass4 = object_getClass(obj1);
Class objectClass5 = object_getClass(obj2);
  • objectClass1 ~ objectClass5都是NSObjectclass對(duì)象(類對(duì)象)
  • 它們是同一個(gè)對(duì)象, 每個(gè)類在內(nèi)存中有且只有一個(gè)class對(duì)象, 可以通過(guò)打印內(nèi)存證明:
NSLog(@"%p %p %p %p %p",
      objectClass1,
      objectClass2,
      objectClass3,
      objectClass4,
      objectClass5);
// 打印結(jié)果: 0x7fff955aa140 0x7fff955aa140 0x7fff955aa140 0x7fff955aa140 0x7fff955aa140
  • 通過(guò)打印結(jié)果可以證明, objectClass1 ~ objectClass5指向這同一塊內(nèi)存地址, 即在內(nèi)存中會(huì)存在一個(gè)類的class對(duì)象

  • class對(duì)象在內(nèi)存中存儲(chǔ)的信息主要包括:

    • isa指針
    • superclass指針
    • 類的屬性信息(@property)
    • 類的對(duì)象方法信息(instance method)
    • 類的協(xié)議信息(protocol)
    • 類的成員變量信息(ivar, 描述成員變量的類型和名字, 而不是如同實(shí)例一般具體的值)
    • ...
  • 如下圖:

image.png

三、meta-class

  • 每個(gè)類在內(nèi)存中有且只有一個(gè)meta-class對(duì)象
  • 可以通過(guò)運(yùn)行時(shí)的object_getClass(類對(duì)象)方法獲取類的元類型
// Runtime API
Class objectMetaClass = object_getClass([NSObject class]); 
  • objectMetaClassNSObjectmeta-class對(duì)象(元類對(duì)象)

  • meta-class對(duì)象和class對(duì)象的內(nèi)存結(jié)構(gòu)是一樣的,但是用途不一樣,在內(nèi)存中存儲(chǔ)的信息主要包括:

    • isa指針
    • superclass指針
    • 類的類方法信息(class method)
image.png

注意: meta-class對(duì)象class對(duì)象擁有相同的結(jié)構(gòu), 意思如下圖

image.png

class對(duì)象中, 類方法信息為空, meta-class方法中屬性信息、對(duì)象方法信息、協(xié)議信息、成員變量信息為空

注意: - (Class)class+ (Class)class方法只能獲取class對(duì)象, 不能獲取meta-class對(duì)象
meta-class對(duì)象只能通過(guò)Runtimeobject_getClass(類對(duì)象)獲取

  • 可以通過(guò)Runtimeclass_isMetaClass(對(duì)象)函數(shù), 來(lái)判斷對(duì)象是否是元類型
Class objectClass = [NSObject class];
NSLog(@"%d", class_isMetaClass(objectClass));           // 打印: 0

Class objectMetaClass = object_getClass([NSString class]);
NSLog(@"%d", class_isMetaClass(objectMetaClass));       // 打印: 1
  • 下面是objc_getClassobject_getClass、- (Class)class、+ (Class)class的區(qū)別
 1.Class objc_getClass(const char *aClassName)
 1> 傳入字符串類名
 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)容