一個(gè)NSObject對(duì)象占用多少內(nèi)存?
a景馁、系統(tǒng)會(huì)分配16個(gè)字節(jié)給NSObject對(duì)象(導(dǎo)入<malloc/malloc.h>粱年,通過malloc_size((__bridge const void *)obj)函數(shù)來獲取,注意:結(jié)構(gòu)體會(huì)有字節(jié)對(duì)齊原則邻奠,所以內(nèi)存都會(huì)是16的倍數(shù))
b、但是NSObject對(duì)象內(nèi)部實(shí)際上只占用了8個(gè)字節(jié)(導(dǎo)入<objc/runtime.h>,64位環(huán)境下罗洗,通過class_getInstanceSize([NSObject class])函數(shù)獲得,注意:同上根據(jù)字節(jié)對(duì)其原則钢猛,這個(gè)實(shí)際內(nèi)存都會(huì)是8的倍數(shù))
對(duì)象的isa指針指向哪里?
對(duì)于這個(gè)問題伙菜,首先你要弄懂以下問題
對(duì)象分三種:實(shí)例對(duì)象instance、類對(duì)象class命迈、元類對(duì)象meta-class贩绕,而且火的,三種對(duì)象中分別存儲(chǔ)著以下內(nèi)容
(補(bǔ)充:注意,此處的類對(duì)象的成員變量淑倾,是主要存儲(chǔ)其setter和getter方法的馏鹤,這也是主要區(qū)別于分類為什么不能給成員變量賦值的關(guān)鍵(runtime的另算))
由此,也引申出了class對(duì)象的superclass指針的指向
例如:@interface Student :Person????????????@interface Person:NSObject
那么你會(huì)發(fā)現(xiàn)他們的superclass指針的指向?yàn)橄聢D所示
再由此娇哆,引申出了meta-class對(duì)象的superclass指針的指向
通過以上逐層分析湃累,再看下圖,Subclass=Student碍讨,Person=Superclass治力,NSObject=Rootclass,你是否會(huì)瞬間明白勃黍,唯一需要注意的就是根類的superclass指針指向的是根類的類對(duì)象
+load方法的調(diào)用順序
首先宵统,要明白的是,+load方法會(huì)在runtime加載類覆获、分類時(shí)調(diào)用马澈,而且每個(gè)類、分類的+load弄息,在程序運(yùn)行過程中只會(huì)調(diào)用一次箭券,經(jīng)過一波簡單的分析源碼得出
調(diào)用順序?
1、先調(diào)用類的+load方法疑枯;
a辩块、按照編譯先后順序調(diào)用(先編譯先調(diào)用)b、調(diào)用子類的+load方法之前荆永,會(huì)先調(diào)用父類的+load方法
2废亭、再調(diào)用編譯先后順序調(diào)用(先編譯先調(diào)用)