国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

OC:對(duì)象、類、元類

2019-11-06 09:47:24
字體:
供稿:網(wǎng)友

老實(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也就是元類。

那么obj和class的區(qū)別會(huì)在哪里?

    __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就能畫出文章開頭里別人的文章里的介紹圖了

另:

歡迎指出問題和話題討論


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桦甸市| 宝坻区| 河源市| 团风县| 于都县| 盈江县| 和田县| 宾阳县| 隆安县| 蓬溪县| 黄骅市| 沙湾县| 柳林县| 儋州市| 芮城县| 荣成市| 合水县| 吉安县| 锡林郭勒盟| 黔东| 洛川县| 申扎县| 太谷县| 航空| 营山县| 洞口县| 尼勒克县| 德钦县| 自治县| 交城县| 肥西县| 昭觉县| 凯里市| 岳池县| 尚义县| 喀什市| 泰安市| 大同县| 四川省| 静乐县| 沾益县|