2019 iOS 面試 -中級(jí)篇之 Runtime

1. objc在向一個(gè)對(duì)象發(fā)送消息時(shí)喊巍,發(fā)生了什么疆瑰?

根據(jù)對(duì)象的isa指針找到該對(duì)象所屬的類办陷,去obj的對(duì)應(yīng)的類中找方法

  • 1.首先琅轧,在相應(yīng)操作的對(duì)象中的緩存方法列表中找調(diào)用的方法析孽,如果找到搭伤,轉(zhuǎn)向相應(yīng)實(shí)現(xiàn)并執(zhí)行。
  • 2.如果沒找到袜瞬,在相應(yīng)操作的對(duì)象中的方法列表中找調(diào)用的方法怜俐,如果找到,轉(zhuǎn)向相應(yīng)實(shí)現(xiàn)執(zhí)行
  • 3.如果沒找到邓尤,去父類指針?biāo)赶虻膶?duì)象中執(zhí)行1拍鲤,2.
  • 4.以此類推,如果一直到根類還沒找到汞扎,轉(zhuǎn)向攔截調(diào)用季稳,走消息轉(zhuǎn)發(fā)機(jī)制。
  • 5.如果沒有重寫攔截調(diào)用的方法澈魄,程序報(bào)錯(cuò)景鼠。

如果向一個(gè)nil對(duì)象發(fā)送消息,首先在尋找對(duì)象的isa指針時(shí)就是0地址返回了一忱,所以不會(huì)出現(xiàn)任何錯(cuò)誤莲蜘。也不會(huì)崩潰。
參考:ios objc向一個(gè)對(duì)象發(fā)送消息時(shí)帘营,發(fā)生了什么票渠?

2. 什么時(shí)候會(huì)報(bào)unrecognized selector錯(cuò)誤?iOS有哪些機(jī)制來避免走到這一步芬迄?

  • 對(duì)象未實(shí)現(xiàn)該方法问顷。
  • 對(duì)象已經(jīng)被釋放。

避免:

3. 能否向編譯后得到的類中增加實(shí)例變量肠骆?能否向運(yùn)行時(shí)創(chuàng)建的類中添加實(shí)例變量?為什么塞耕?

  • 不能向編譯后得到的類增加實(shí)例變量
  • 能向運(yùn)行時(shí)創(chuàng)建的類中添加實(shí)例變量

解釋:

  • 1.編譯后的類已經(jīng)注冊(cè)在runtime中,類結(jié)構(gòu)體中的objc_ivar_list實(shí)例變量的鏈表和instance_size實(shí)例變量的內(nèi)存大小已經(jīng)確定,runtime會(huì)調(diào)用class_setvarlayout或class_setWeaklvarLayout來處理strong weak引用.所以不能向存在的類中添加實(shí)例變量
  • 2.運(yùn)行時(shí)創(chuàng)建的類是可以添加實(shí)例變量,調(diào)用class_addIvar函數(shù).但是的在調(diào)objc_allocateClassPair之后,objc_registerClassPair之前,原因同上.

參考:能否向編譯后得到的類中增加實(shí)例變量蚀腿?

4. runtime如何實(shí)現(xiàn)weak變量的自動(dòng)置nil?

首先要搞清楚weak屬性的特點(diǎn):

  • weak策略表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)扫外。為這種屬性設(shè)置新值時(shí)莉钙,設(shè)置方法既不保留新值,也不釋放舊值筛谚。此特質(zhì)同assign類似;然而在屬性所指的對(duì)象遭到摧毀時(shí)磁玉,屬性值也會(huì)清空(nil out)
    那么runtime如何實(shí)現(xiàn)weak變量的自動(dòng)置nil?

  • runtime對(duì)注冊(cè)的類驾讲,會(huì)進(jìn)行布局蚊伞,會(huì)將 weak 對(duì)象放入一個(gè) hash 表中。用 weak 指向的對(duì)象內(nèi)存地址作為 key吮铭,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì)調(diào)用對(duì)象的 dealloc 方法时迫,假設(shè) weak 指向的對(duì)象內(nèi)存地址是a,那么就會(huì)以a為key沐兵,在這個(gè) weak hash表中搜索别垮,找到所有以a為key的 weak 對(duì)象,從而設(shè)置為 nil扎谎。
    weak屬性需要在dealloc中置nil么?

  • 在ARC環(huán)境無論是強(qiáng)指針還是弱指針都無需在 dealloc 設(shè)置為 nil 碳想, ARC 會(huì)自動(dòng)幫我們處理,即便是編譯器不幫我們做這些,weak也不需要在dealloc中置nil,在屬性所指的對(duì)象遭到摧毀時(shí)毁靶,屬性值也會(huì)清空

模擬下weak的setter方法胧奔,大致如下

- (void)setObject:(NSObject *)object{ 
    objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN); 
    [object cyl_runAtDealloc:^{
        _object = nil; 
    }];
}

參考鏈接:runtime 相關(guān)試題解答

5. 給類添加一個(gè)屬性后,在類結(jié)構(gòu)體里哪些元素會(huì)發(fā)生變化预吆?

  • instance_size :實(shí)例的內(nèi)存大小
  • objc_ivar_list *ivars:屬性列表

參考鏈接:靠譜的 iOS 面試題

相關(guān)閱讀:

1龙填、iOS 面試題 --- 基礎(chǔ)部分
2、iOS 面試題 --- 中級(jí)篇 Block
3拐叉、iOS 面試題 --- 中級(jí)篇 Runloop
4岩遗、iOS 面試題 --- 高級(jí)篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凤瘦,隨后出現(xiàn)的幾起案子宿礁,更是在濱河造成了極大的恐慌,老刑警劉巖蔬芥,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梆靖,死亡現(xiàn)場離奇詭異控汉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)返吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門姑子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人测僵,你說我怎么就攤上這事街佑。” “怎么了恨课?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵舆乔,是天一觀的道長岳服。 經(jīng)常有香客問我剂公,道長,這世上最難降的妖魔是什么吊宋? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任纲辽,我火速辦了婚禮,結(jié)果婚禮上璃搜,老公的妹妹穿的比我還像新娘拖吼。我一直安慰自己,他們只是感情好这吻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布吊档。 她就那樣靜靜地躺著,像睡著了一般唾糯。 火紅的嫁衣襯著肌膚如雪怠硼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天移怯,我揣著相機(jī)與錄音香璃,去河邊找鬼。 笑死舟误,一個(gè)胖子當(dāng)著我的面吹牛葡秒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嵌溢,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼眯牧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赖草?” 一聲冷哼從身側(cè)響起学少,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疚顷,沒想到半個(gè)月后旱易,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禁偎,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年阀坏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了如暖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忌堂,死狀恐怖盒至,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情士修,我是刑警寧澤枷遂,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站棋嘲,受9級(jí)特大地震影響酒唉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沸移,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一痪伦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雹锣,春花似錦网沾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攒射,卻和暖如春醋旦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匆篓。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工浑度, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸦概。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓箩张,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窗市。 傳聞我的和親對(duì)象是個(gè)殘疾皇子先慷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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