Strong 與 Weak
- Strong 的參考上是參考到一個物件一直到當該物件被 deallocted,也就是會幫我們建立出彼此的關聯性,建立彼此的擁有權生命週期。
- Weak 的參考上是一直對應到該物件,就算這個物件被 dealloc 了還是存在。所以它不會建立擁有權。
- _strong 是預設值,所以不打出來就是這樣的方式,建立了物件就會幫忙處理所有的 retained 和 released,自己內部這個物件使用。
- _weak 代表這個物件可以隨時不見都沒有關係,如果對應到某個物件就算被 dealloc 它就會變成 nil 。
- unsafe_unretained 這是跟 weak 一樣,但是當物件被 dealloc 不會將指標變成 nil。只是會變成指到無效的物件。
- _autoreleasing 這會指引到該物件並且建立 autorelease 關係。
原文參考
http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
此處還需另外參考ARC Overview
weak除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。没办法,还是 “强哥” 有面子。
簡 單說來,在XCode4.2的機制下物件有分為兩種,一種是weak的參照,一種是strong的參照。weak的參照就像是一般的C下面的記憶體參照, 純粹就是一個記憶體的指標,指向一個記憶體中的物件。同時在自動的參照記數下,如果它所指向的物件在空間中的被移除配置(deallocate)了之後, 它的值也會被設成nil,這樣才不會變成一個指向不合法空間的指標。因此你可以想像這種weak的用法就像是以前的assign,只是現在的記憶體管理機 制會幫你把這個變數的參照設定成nil。
而相較於weak,strong所代表的就像是我們所熟悉的retain,因此你可以確保這個成員變數在它的母物件尚未被釋放前都是依然有效的。
其中strong,通過pointer,將資料放在堆疊中,而不是放在一般的記憶體中。如果pointer改指向nil,計數就會減一。或是將資料從堆疊中取出,計數也會減一。
在記憶體管理中,會有一個計數器計數堆疊數,當計數回到0的時候就會釋放記憶體。
一般的local variables就是strong pointer
weak只在iOS5下面起作用,iOS4不會將pointer自動歸0,因此只能用 strong,手動將它歸到0。