【轉載】objective-c強引用與弱引用

形象比喻蠻好玩的^_^ 
 
__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
相關文章
相關標籤/搜索