記一道面試題

昨天去面試腔召,和面試官談到類對(duì)象的method列表相關(guān)話題,他突然問了個(gè)問題扮惦,你覺得類的method列表是什么時(shí)候被添加到對(duì)象上去的臀蛛?他說的主要是[[AClass alloc] init]這個(gè)過程,又問我init方法是必須調(diào)的嘛崖蜜?之前對(duì)初始化這塊了解沒這么細(xì)浊仆,所以這次面試回來,就找了runtime的源碼看了一下豫领。

通過翻閱NSObject.mm這個(gè)文件抡柿,大致找到了答案。先說結(jié)論等恐,在alloc的時(shí)候就完成了初始化洲劣。對(duì)于init方法备蚓,如果只是定義NSObject的實(shí)例,不必須調(diào)用init囱稽,其他情況最好調(diào)一下郊尝。原因如下:

我們把a(bǔ)lloc過程的調(diào)用大概列在下面:

+ (id)alloc {
    return _objc_rootAlloc(self);
}

id _objc_rootAlloc(Class cls)
{
    return callAlloc(cls, false/*checkNil*/, true/*allocWithZone*/);
}

static ALWAYS_INLINE id callAlloc(Class cls, bool checkNil, bool allocWithZone=false)
{
    if (checkNil && !cls) return nil;

#if __OBJC2__
    if (! cls->ISA()->hasCustomAWZ()) {
        // No alloc/allocWithZone implementation. Go straight to the allocator.
        // fixme store hasCustomAWZ in the non-meta class and 
        // add it to canAllocFast's summary
        if (cls->canAllocFast()) {
            // No ctors, raw isa, etc. Go straight to the metal.
            bool dtor = cls->hasCxxDtor();
            id obj = (id)calloc(1, cls->bits.fastInstanceSize());
            if (!obj) return callBadAllocHandler(cls);
            obj->initInstanceIsa(cls, dtor);
            return obj;
        }
        else {
            // Has ctor or raw isa or something. Use the slower path.
            id obj = class_createInstance(cls, 0);
            if (!obj) return callBadAllocHandler(cls);
            return obj;
        }
    }
#endif

    // No shortcuts available.
    if (allocWithZone) return [cls allocWithZone:nil];
    return [cls alloc];
}

上面代碼中有一個(gè)方法obj->initInstanceIsa(cls, dtor),這個(gè)方法最終會(huì)調(diào)到下面這個(gè)方法(下面那個(gè)else分支最終也會(huì)走到這么個(gè)方法):

inline void 
objc_object::initIsa(Class cls, bool indexed, bool hasCxxDtor) 
{ 
    assert(!isTaggedPointer()); 
    
    if (!indexed) {
        isa.cls = cls;
    } else {
        assert(!DisableIndexedIsa);
        isa.bits = ISA_MAGIC_VALUE;
        // isa.magic is part of ISA_MAGIC_VALUE
        // isa.indexed is part of ISA_MAGIC_VALUE
        isa.has_cxx_dtor = hasCxxDtor;
        isa.shiftcls = (uintptr_t)cls >> 3;
    }
}

在這個(gè)方法中战惊,對(duì)cls屬性進(jìn)行了賦值流昏,也就是確定了類的歸屬,并連接到了那個(gè)類样傍,所以在alloc的時(shí)候完成了cls的賦值横缔,也就是在alloc的時(shí)候就初始化完成了铺遂。

接下來再看init方法:

- (id)init {
    return _objc_rootInit(self);
}

id _objc_rootInit(id obj)
{
    return obj;
}

在NSObject中只是簡單返回了這個(gè)自身衫哥。所以如果你是調(diào)用別人寫的類或者自己寫的繼承自NSObject并且自己在init中做了自定義的,那肯定是要調(diào)的襟锐。

參考

ios-runtime

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撤逢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粮坞,更是在濱河造成了極大的恐慌蚊荣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莫杈,死亡現(xiàn)場離奇詭異互例,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)筝闹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門媳叨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人关顷,你說我怎么就攤上這事糊秆。” “怎么了议双?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵痘番,是天一觀的道長。 經(jīng)常有香客問我平痰,道長汞舱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任宗雇,我火速辦了婚禮昂芜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逾礁。我一直安慰自己说铃,他們只是感情好访惜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腻扇,像睡著了一般债热。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幼苛,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天窒篱,我揣著相機(jī)與錄音,去河邊找鬼舶沿。 笑死墙杯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的括荡。 我是一名探鬼主播高镐,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼畸冲!你這毒婦竟也來了嫉髓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤邑闲,失蹤者是張志新(化名)和其女友劉穎算行,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苫耸,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡州邢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褪子。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片量淌。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖褐筛,靈堂內(nèi)的尸體忽然破棺而出类少,到底是詐尸還是另有隱情,我是刑警寧澤渔扎,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布硫狞,位于F島的核電站,受9級(jí)特大地震影響晃痴,放射性物質(zhì)發(fā)生泄漏残吩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一倘核、第九天 我趴在偏房一處隱蔽的房頂上張望泣侮。 院中可真熱鬧,春花似錦紧唱、人聲如沸活尊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛹锰。三九已至深胳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铜犬,已是汗流浹背舞终。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留癣猾,地道東北人敛劝。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像纷宇,于是被迫代替她去往敵國和親夸盟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容