老實(shí)講,從java轉(zhuǎn)OC后頭一回碰到元類的概念時(shí)有點(diǎn)懵,這篇博文算是往回看,看看oc的對(duì)象、類、元類間
如果你是頭一回知道這個(gè)概念,可以先看看別人的文章,和別人的文章等
別人的文章里有一副概念圖!!
看下結(jié)論,NSObject,Class,MetaClass都是objc_object結(jié)構(gòu)體。
class和metaclass是objc_object很好證明,代碼里寫著class的isa是class(具體見class_getMetaClass實(shí)現(xiàn)),class是objc_class而objc_class集成objc_object,那么為什么NSObject是objc_object,目前我只能的從objc_isClass(id obj)接受參數(shù)id指針(代碼里定義為objc_object指針),但可以調(diào)用objc_isClass(objcInstance)(傳入對(duì)象實(shí)例)來略窺一二,NSObject也是objc_object。這里對(duì)于NSObject是objc_object有直接證明的望指教!
NSObject唯一的私有變量isa指向了Class, Class的isa指向了另一個(gè)Class也就是元類。
__unused BOOL objIsNotClass = object_isClass(self); __unused BOOL ClassIsCls = object_isClass([self class]); __unused BOOL MetaClassIsCls = object_isClass(objc_getMetaClass(object_getClassName([self class])));引入<objc.runtime.h>后可自行測(cè)試,self為對(duì)象實(shí)例
答案很清晰,那么結(jié)論那里來?
進(jìn)入該方法看到最后一步是判斷isMetaClass,斷點(diǎn)調(diào)試,以下是我的實(shí)驗(yàn)結(jié)果(稍等,哪里有代碼?可參考這篇文章末尾)
打印出class_ro_t結(jié)構(gòu)體:
簡(jiǎn)單拿結(jié)果套下公式可以知道結(jié)果,至于為什么flag會(huì)有這樣的區(qū)別,挖個(gè)坑以后再看
畫圖
利用class_getMetaClass(cls)可以得到
class->metaclass->nsobjectMetaClass->nsobjectMetaClass 這樣的路徑
再結(jié)合superclass就能畫出文章開頭里別人的文章里的介紹圖了
另:
歡迎指出問題和話題討論
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注