iOS经典面试题之“runtime是如何实现weak变量的自动置nil”
生活随笔
收集整理的這篇文章主要介紹了
iOS经典面试题之“runtime是如何实现weak变量的自动置nil”
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、weak 屬性特點
- weak 表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship);
- 為 weak 屬性設(shè)置新值時,設(shè)置方法既不保留新值,也不釋放舊值;
- 同 assign 類似,然而在屬性所指的對象釋放時候,屬性值也會清空(nil out)。
二、runtime 如何實現(xiàn) weak 屬性
① 實現(xiàn)步驟
- 初始化時:runtime 會調(diào)用 objc_initWeak 函數(shù),初始化一個新的 weak 指針指向?qū)ο蟮牡刂贰?/li>
- 添加引用時:objc_initWeak 函數(shù)會調(diào)用 objc_storeWeak(&weakPo, Model) 函數(shù)。
- 釋放時:調(diào)用 clearDeallocating 函數(shù),clearDeallocating 函數(shù)首先根據(jù)對象地址獲取所有 weak 指針地址的數(shù)組,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為 nil,最后把這個 entry 從 weak 表中刪除,最后清理對象的記錄。
② objc_storeWeak(&weakPo, Model) 作用
- objc_storeWeak(&weakPo, Model) 的作用是更新指針指向(指針可能原來指向著其他對象,這時候需要將該 weak 指針與舊對象解除綁定,會調(diào)用到 weak_unregister_no_lock),如果指針指向的新對象非空,則創(chuàng)建對應(yīng)的弱引用表,將 weak 指針與新對象進行綁定(即把賦值對象(Model)的內(nèi)存地址作為鍵值key,將weak修飾的屬性變量(weakPo)的內(nèi)存地址(& weakPo)作為value),會調(diào)用到weak_register_no_lock,注冊到 weak 表中。在這個過程中,為了防止多線程中競爭沖突,會有一些鎖的操作。
- 如果Model 為0(nil),那么把變量 weakPo 的內(nèi)存地址 &weakPo 從 weak 表中刪除,可以把 objc_storeWeak(&weakPo, Model) 理解為:objc_storeWeak(value, key),并且當(dāng)key變nil,將value置nil。
- 在 Model 非 nil 時,weakPo 和 Model 指向同一個內(nèi)存地址,在 Model 變 nil 時,weakPo 變 nil。此時向 weakPo 發(fā)送消息不會崩潰:在 Objective-C 中向 nil 發(fā)送消息是安全的。
三、runtime 是如何實現(xiàn) weak 變量的自動置 nil ?
- runtime 對注冊的類,會進行內(nèi)存布局,從一個粗粒度的概念上來講,這時候 weak 對象會放入一個 hash 表中,這是一個全局表,表中是用 weak 指向的對象內(nèi)存地址作為 key,用所有指向該對象的 weak 指針表作為 value。
- 當(dāng)此對象的引用計數(shù)為 0 的時候會 dealloc,假如該對象內(nèi)存地址是 address,那么就會以 address 為 key,在這個weak 表中搜索,找到所有以 address 為鍵的 weak 對象,從而設(shè)置為 nil。
- 簡而言之,對象釋放的時候 - dealloc: 步驟如下:
- C++函數(shù)釋放: object_ cxxDestruct;
- 移除關(guān)聯(lián)屬性:_ object_ remove_ assocations;
- 將弱引用自動設(shè)置nil : weak_ clear_ no_ lock(&table.weak_ table, (id)this);
- 引用計數(shù)處理: table.refcnts.erase(this);
- 銷毀對象: free(obj);
四、weak 底層調(diào)用流程
總結(jié)
以上是生活随笔為你收集整理的iOS经典面试题之“runtime是如何实现weak变量的自动置nil”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS经典面试题之深入分析“内存平移”的
- 下一篇: iOS之深入探究多线程实现、线程安全和线