struct NSObject_IMPL {
Class isa; // 8個字節(jié)
}
一個NSObject對象占用多少內存喂饥?
系統(tǒng)分配16個字節(jié)給NSObject對象(通過malloc_size獲得)
但NSObject對象內部只使用了8個字節(jié)的空間 (64bit環(huán)境下雏节,通過 class_getInstanceSize函數獲得)
//創(chuàng)建一個實例對象扰柠,至少需要多少內存,結構體內存對齊后的
#import <objc/runtime.h>
class_getInstanceSize([NSObject class])
//創(chuàng)建一個實例對象藐吮,實際分配多少內存 iOS操作系統(tǒng)給對象的內存地址是16的倍數
#import <malloc/malloc.h>
malloc_size(const void *ptr)
大端 小端(高地址->低地址)
struct的內存對齊
isa是objc_class 結構體的指針(struct objc_class *class)
ios操作系統(tǒng)給對象的內存地址是16的倍數 16 32 48 ...
子類繼承父類內存的分配
屬性對應的方法不放在實例對象內存內
sizeof() 是運算符溺拱,編譯時會轉化成常量,傳指針變量時谣辞,返回的是指針變量的字節(jié)長度
一個類的類對象在內存中是唯一的迫摔,元類對象也是唯一的
instance對象在內存中存儲的信息主要包括
a) isa指針
b) 其他成員變量
Class對象在內存中存儲的信息主要包括
a) isa指針
b) superclass指針
c) 類的屬性信息(@property),
d) 類的對象方法信息(instance method)
e) 類的協議信息(protocol),
f) 類的成員變量信息(ivar,不含值泥从,值放在實例對象內存)
meta-class元類對象句占, 將類對象當做參數傳入,獲得元類對象
Class objectMetaClass = object_getClass([NSObject class]);
每個類只有一個元類對象
meta-class對象和class對象的內存結構是一樣的(都是Class)躯嫉,但是用途不一樣纱烘,在內存中存儲的主要信息包括
a) isa指針
b) superclass指針
c) 類的類方法信息(class method)
- Class object_getClass(const char *aClassName)
1> 傳入字符串類名
2> 返回對應的類對象
- 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對象
- *(Class)class 、 - (Class)class
1> 返回的就是類對象