理解strong與weak)強引用與弱引用轉載自《http://blog.sina.com.cn/s/blog_7c8dc2d50101lc08.html》

__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),就是爲了避免retaincycles(就是父類中含有子類{父類retain了子類},子類中又調用了父類{子類又retain了父類},這樣都無法release)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章