注:本文集為自己準(zhǔn)備面試時(shí),系統(tǒng)復(fù)習(xí)的筆記禀崖,如大家有興趣,歡迎閱讀并指正
1.autoreleaspool有什么用捷兰,什么時(shí)候創(chuàng)建访圃,什么時(shí)候釋放?
2.__strong告私、__weak屎暇、assign的修飾符的底層實(shí)現(xiàn),引用計(jì)數(shù)器的位置驻粟?
3.什么是消息轉(zhuǎn)發(fā)和消息查找根悼?如何捕捉崩潰?
4.分類(lèi)為什么沒(méi)有屬性蜀撑?分類(lèi)和擴(kuò)展區(qū)別挤巡,為什么分類(lèi)不可以添加屬性,擴(kuò)展可以酷麦?
1矿卑、內(nèi)存布局
- 代碼區(qū):程序代碼
- 全局區(qū):未初始化及已初始化。
- 堆區(qū):低地址到高地址
- 棧區(qū):高地址到低地址
2沃饶、內(nèi)存管理方案
- TaggedPointer:小對(duì)象管理
- NONPOINTER_ISA:非指針性的isa指針
arm64架構(gòu):64個(gè)比特位母廷。- 第一位:是否是純指針,如果否表示含有引用技術(shù)表
- 第二位:是否有關(guān)聯(lián)對(duì)象
- 第三位:表示是否含有c++的內(nèi)容
- 第4位-第37位:當(dāng)前位的類(lèi)對(duì)象指針地址
- 第42位:弱引用表
- 第43位:是否正在deallocating操作
- 第44位:散列表
- extra_rc:存儲(chǔ)<10的引用計(jì)數(shù)器
- 散列表(引用計(jì)數(shù)表和弱引用表)
- Slide Tables(): 包含Slide Table的數(shù)組糊肤,為哈希表琴昆,
- Slide Table:包含spinlock_t(自旋鎖)、RefcountMap(引用計(jì)數(shù)表)馆揉、weak_table_t(弱引用表)
- 為什么不是一個(gè)Slide Table而是Tables业舍?
存在改變對(duì)象有讀寫(xiě)安全問(wèn)題,讀寫(xiě)安全需要加鎖升酣,因此為提高效率分成多個(gè)table舷暮。
ps:散列表本質(zhì)就是一張哈希表,實(shí)現(xiàn)快速分流噩茄,什么是哈希表下面?
ptr->f(ptr) ->index
3、數(shù)據(jù)結(jié)構(gòu)
Spinlock_t
- spinlock_t是“忙等”的鎖巢墅,適用于輕量訪(fǎng)問(wèn)
- 自旋鎖和普通的鎖有什么區(qū)別诸狭?適用于哪些場(chǎng)景券膀?
RefcountMap:引用技術(shù)表,哈希表驯遇。適用哈希為了提高查找效率
weak_table_t:弱引用表芹彬。key:對(duì)象指針、value:weak修飾的指針
4叉庐、MRC和ARC
MRC:手動(dòng)引用計(jì)數(shù)舒帮。
ARC:是LLVM和Runtime協(xié)作的結(jié)果。禁止手動(dòng)調(diào)用retain/release/retainCount/dealloc
5陡叠、引用計(jì)數(shù)管理
dealloc釋放過(guò)程:
dealloc方法實(shí)現(xiàn)如下圖
判斷是否是pointer_isa玩郊,weak表,關(guān)聯(lián)對(duì)象枉阵,c++译红,slidtable表是否釋放
object_dispose()方法實(shí)現(xiàn)如下圖
6、弱引用原理
- 聲明
__weak聲明的指針兴溜,經(jīng)過(guò)編譯器聲明侦厚,會(huì)調(diào)用objc_initWeak()方法繼續(xù)調(diào)用storeWeak()方法,最后會(huì)調(diào)用weak_register_no_lock()方法進(jìn)行弱引用變量添加拙徽,具體添加的位置是通過(guò)哈希算法查找到index刨沦,如果存在,添加到原有的數(shù)組中膘怕,如果沒(méi)有創(chuàng)建弱引用數(shù)組想诅,index=0存放改指針。 - 清除
weak_clear_no_lock()岛心。當(dāng)一個(gè)對(duì)象dealloc来破,dealloc方法中會(huì)對(duì)weak清除的函數(shù),會(huì)根據(jù)當(dāng)前對(duì)象指針查找弱引用表鹉梨,把當(dāng)前對(duì)象相對(duì)應(yīng)的引用都拿出來(lái)數(shù)組讳癌,并把當(dāng)前數(shù)組所有指針置為nil。
7.自動(dòng)釋放池
- AutoreleasePool的實(shí)現(xiàn)原理是怎樣的存皂?
- AutoreleasePool為何可以嵌套使用?
@autoreleasepool{}
// => 等價(jià)于
void *ctx = objc_autoreleasePoolPush();
{}
objc_autoreleasePoolPop(ctx);
什么是自動(dòng)釋放池逢艘?
- 以棧為結(jié)點(diǎn)通過(guò)雙向鏈表的形式組合而成的數(shù)據(jù)結(jié)構(gòu)旦袋,是和線(xiàn)程一一對(duì)應(yīng)
自動(dòng)釋放池什么時(shí)候創(chuàng)建,什么時(shí)候銷(xiāo)毀它改?
8疤孕、循環(huán)引用?
- 自循環(huán)引用
- 相互循環(huán)引用央拖,__block可以使用循環(huán)引用祭阀?
- 多循環(huán)引用
是否在開(kāi)發(fā)過(guò)程中碰到循環(huán)引用問(wèn)題鹉戚,你是怎么解決的?
Block循環(huán)引用
NSTimer循環(huán)引用