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)被釋放。
避免:
- 使用[id respondsToSelector:]進(jìn)行判斷。
參考:什么時(shí)候會(huì)報(bào)unrecognized selector錯(cuò)誤杜窄?
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之前,原因同上.
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;
}];
}
5. 給類添加一個(gè)屬性后,在類結(jié)構(gòu)體里哪些元素會(huì)發(fā)生變化预吆?
- instance_size :實(shí)例的內(nèi)存大小
- objc_ivar_list *ivars:屬性列表
相關(guān)閱讀:
1龙填、iOS 面試題 --- 基礎(chǔ)部分
2、iOS 面試題 --- 中級(jí)篇 Block
3拐叉、iOS 面試題 --- 中級(jí)篇 Runloop
4岩遗、iOS 面試題 --- 高級(jí)篇