日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS经典面试题之“runtime是如何实现weak变量的自动置nil”

發(fā)布時間:2024/5/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 指針與新對象進(jìn)行綁定(即把賦值對象(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 對注冊的類,會進(jìn)行內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。