標籤:
__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)
iOS strong和weak聯絡生活中的例子