weak關鍵字

什么情況下使用 weak 關鍵字?

1. 在 ARC 中,在有可能出現循環引用的時候,此時會使用使用 weak 關鍵字來解決。例如:delegate 屬性。
(1). delegate 屬性為什么使用 weak, 而不是 assign ?

weak 此特質表明了該屬性定義了一種“非擁有關系”(nonowning relationship)。為這種屬性設置新值時,設置方法既不保留新值,也不會釋放舊值。此特質同 assign 類似,然而在屬性指向的對象遭到銷毀時,屬性值也會清空(nil out)。而 assign 的“設置方法”只會執行針對“純量類型”(scalar type,例如 CGFloat 或 NSInteger 等)的簡單復制,單純的拷貝所賦值變量的值。當其保存地址(指向)的對象遭到銷毀時,其保存的地址依然存在(形成野指針),向其保存的地址發送消息,則會造成 crash。(assign 可以用于非 OC 對象,而 weak 必須用于 OC 對象)

(2).weak 的內部實現原理

系統會有一個全局的 CFMutableDictionary 實例(hash 表),來保存每個對象的 weak 指針列表,用 weak 指向的對象內存地址作為 key,因為每個對象可能有多個 weak 指針,所以這個實力的值是 CFMutableSet 類型(weak 修飾的屬性變量的內存地址)。當引用計數為0的時候會 dealloc,去這個全局的 CFMutableDictionary 字典中查找每個 weak 指針,將其設置為 nil。

2. 在自身對其進行過一次強引用,沒有必要再強引用一次的時候,此時也會使用 weak,自定義 IBOutlet 控件也一般使用weak,也可以為 strong。
(1). IBOutlet 連出來的視圖屬性為什么可以被設置成 weak?

使用 xib/storyboard 創建 viewController,會有一個叫做 _topLevelObjectsToKeepAliveFromStoryboard 的私有數組強引用所有的 top level 的對象,同時 top level 對象強引用所有子對象,那么viewController沒有必要再強應用 top level 對象的子對象。

具體內容請查看下列文章:

iOS面試題集錦(附答案)
iOS 面試題(五):weak 的內部實現原理
IBOutlet連出來的視圖屬性為什么可以被設置成weak?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容