如何理解 Objective-C 中的 strong 和 weak ?


我覺得這種問題,如果你想真的掌握,沒有比官方文檔更靠譜的了。

Transitioning to ARC Release Notes

這個是 Apple developer site 裡面的關於 ARC 的文檔。

如果上面那個還滿足不了你,看下面這個:

Objective-C Automatic Reference Counting (ARC)

這個是 LLVM Clang項目裡面的對 ARC 的文檔,在更底層接近編譯的一級介紹了 ARC 的方方面面。


strong 修飾的屬性會在賦值時調用被指向對象的 retain 方法,導致其引用計數加1 。

weak 則不會。

另外還有個 unsafe_unretained,跟 weak 類似,區別是被指向對象消失時不會「自動「變成 nil 。


顧名思義:

strong屬性指的是對這個對象強烈的佔有!不管別人對它做過什麼,反正你就是佔有著!它對於你隨叫隨到。

weak指的是對這個對象弱弱的保持著聯繫,每次使用的時候你弱弱的問它一句「還在嗎」,如果沒人回應(變成nil),就說明它已經離開你了(大概是被系統殘忍的回收了吧)。


誰持有,誰strong;誰借用,誰weak


只要有任何strong 指向某個對象A,ARC就不會摧毀它(A)。

而weak所指向的對象B,只要沒有其他strong指向該對象(B),ARC會摧毀它(B)。


補一個淺顯易懂的教程: copy,assign,strong,retain,weak,readonly,readwrite,nonatomic,atomic,unsafe_unretained的使用與區別

iOS開發——OC篇常用關鍵字的使用與區別


新人求解:

@property(weak) UIButton *button;

{

UIButton *button = [[UIButton alloc]init];

self.button = button;

[self.view addSubview:self.button];

}

對於這種情況,button局部變數在這個方法執行完後就釋放掉了,創建出來的控制項並沒有強引用引用著,為什麼在這個方法執行完之後控制項還是存在


weak引用是為解決相互引用形成的死鎖或死鎖鏈,類似操作系統解決死鎖一樣。strong引用是一般意義上的,這個概念是從c++的面向對象引入的,在c++的boost中也有相關的弱引用和強引用的指針。


推薦閱讀:

為什麼 intrusive_ptr 沒有進入標準庫?
現代c++內存管理的方式有哪些?
Firefox和Chrome相比是否更適合小內存用戶?
c++字元串拷貝和內存問題?

TAG:iOS開發 | 面向對象編程 | 內存管理 | Objective-C |