如何理解 Objective-C 中的 strong 和 weak ?
01-05
我覺得這種問題,如果你想真的掌握,沒有比官方文檔更靠譜的了。
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 |