形象比喻蠻好玩的^_^
__weak 和 __strong 會出如今聲明中
默認狀況下,一個指針都會使用 __strong 屬性,代表這是一個強引用。這意味着,只要引用存在,對象就不能被銷燬。這是一種所指望的行爲:當全部(強)引用都去除時,對象才能被收集和釋放。
不過,有時咱們卻但願禁用這種行爲:一些集合類不該該增長其元素的引用,由於這會引發對象沒法釋放。在這種狀況下,咱們須要使用弱引用(不用擔憂,內置的集合類就是這麼幹的),使用 __weak 關鍵字。NSHashTable 就是一個例子。當被引用的對象消失時,弱引用會自動設置爲 nil。Cocoa 的 Notification Center 就是這麼一個例子,雖然這已經超出純 Objective-C 的語言範疇
本身更深理解:
1.(weak與strong)不一樣的是:當一個對象再也不有strong類型的指針指向它的時候,它就會被釋放,即便改對象還有_weak類型的指針指向它;
2.一旦最後一個指向該對象的strong類型的指針離開,這個對象將被釋放,若是這個時候還有weak指針指向該對象,則會清除掉全部剩餘的weak指針
類比爲本身的思想:
一個對象類比爲一條狗, 釋放對象 類比爲 狗要跑掉
邏輯:
strong類型的指針就像是栓住的狗,只要你用繩子拴住狗,那麼狗就不會跑掉.
類比 一個對象 new過之後,不會自動的釋放
若是有5我的都牽着這一條狗(5條繩子栓一隻狗) 類比爲 5個strong類型指針指向一個對象.
除非5個繩子都脫落,不然狗是不會跑掉的,類比,5個strong指針都=nil,則該對象釋放
weak型指針就像是一個小孩子指着狗喊道:「看,有一隻狗在那裏」,只要狗一直被拴着,那麼小孩子就能看到狗(weak指針)會一直指向它,
只要狗的繩子脫落,那麼狗就會跑掉,無論有多少的小孩在看着它。
只要最後一個strong型指針再也不指向對象,那麼對象就會被釋放,同時全部的weak型指針都將會被清除。
在OC中strong就至關於retain屬性,而weak至關於assign。只有一種狀況你須要使用weak(默認是strong),就是爲了不retain cycles(就是父類中含有子類{父類retain了子類},子類中又調用了父類{子類又retain了父類},這樣都沒法release)
原文:http://blog.sina.com.cn/s/blog_7c8dc2d50101lc08.html