oc對象的本質(zhì)

struct NSObject_IMPL {
    Class isa;   //  8個字節(jié)
}

一個NSObject對象占用多少內(nèi)存?
系統(tǒng)分配16個字節(jié)給NSObject對象(通過malloc_size獲得)
但NSObject對象內(nèi)部只使用了8個字節(jié)的空間 (64bit環(huán)境下,通過 class_getInstanceSize函數(shù)獲得)

   //創(chuàng)建一個實例對象,至少需要多少內(nèi)存,結(jié)構(gòu)體內(nèi)存對齊后的
    #import <objc/runtime.h>
    class_getInstanceSize([NSObject class])
  
  //創(chuàng)建一個實例對象,實際分配多少內(nèi)存 iOS操作系統(tǒng)給對象的內(nèi)存地址是16的倍數(shù)
    #import <malloc/malloc.h>
    malloc_size(const void *ptr)

大端 小端(高地址->低地址)
struct的內(nèi)存對齊
isa是objc_class 結(jié)構(gòu)體的指針(struct objc_class *class)
ios操作系統(tǒng)給對象的內(nèi)存地址是16的倍數(shù) 16 32 48 ...
子類繼承父類內(nèi)存的分配
屬性對應(yīng)的方法不放在實例對象內(nèi)存內(nèi)

sizeof() 是運算符,編譯時會轉(zhuǎn)化成常量,傳指針變量時,返回的是指針變量的字節(jié)長度

一個類的類對象在內(nèi)存中是唯一的,元類對象也是唯一的

instance對象在內(nèi)存中存儲的信息主要包括
  a) isa指針
  b) 其他成員變量
Class對象在內(nèi)存中存儲的信息主要包括
   a) isa指針
   b) superclass指針
   c) 類的屬性信息(@property),
   d) 類的對象方法信息(instance method)
   e) 類的協(xié)議信息(protocol),
   f) 類的成員變量信息(ivar,不含值,值放在實例對象內(nèi)存)
meta-class元類對象, 將類對象當(dāng)做參數(shù)傳入,獲得元類對象
  Class objectMetaClass = object_getClass([NSObject class]);
  每個類只有一個元類對象
  meta-class對象和class對象的內(nèi)存結(jié)構(gòu)是一樣的(都是Class),但是用途不一樣,在內(nèi)存中存儲的主要信息包括
    a) isa指針
    b) superclass指針
    c) 類的類方法信息(class method)
  1. Class object_getClass(const char *aClassName)
    1> 傳入字符串類名
    2> 返回對應(yīng)的類對象
  1. Class object_getClass(id )
    1> 傳入的obj可能是instance對象, class對象,meta-class對象
    2> 返回值
    a) 如果是instance對象,返回class對象
    b) 如果是class對象,obj返回meta-class對象
    c) 如果是meta-class對象,返回NSObject(基類)的meta-class對象
  1. *(Class)class 、 - (Class)class
    1> 返回的就是類對象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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