對于strong和weak的內(nèi)存管理情況一直沒有弄太明白,只是簡單的理解為強引用和弱引用,弱引用可以解決循環(huán)引用問題,但是沒有真正的理解strong和weak的內(nèi)存管理情況懊昨,所以把自己的理解記錄一下。
strong:
strong為強引用春宣,強引用也可以理解為持有酵颁,強引用一個對象時,也就是會持有一個對象月帝,該對象的引用計數(shù)是會加1的躏惋。如果不是通過屬性來初始化一個對象的話,系統(tǒng)默認幫我們加了_strong修飾來進行內(nèi)存管理嚷辅,就是這種情況
NSMutableArray *firstArray = [NSMutableArray array];
那么strong修飾的對象什么時候會被釋放呢簿姨?
- 當(dāng)對象的引用計數(shù)為0的時候,該strong對象會被釋放
- 當(dāng)strong修飾的屬性對象簸搞,持有該屬性對象的對象被釋放的時候扁位,通過dealloc方法,會釋放掉所有強引用的對象(也就是說被持有的對象)
那么strong修飾的對象是怎么保存新值趁俊,釋放舊值的域仇?
- (void)setName:(NSString *)name
{
[name retain];
[_name release];
_name = name;
}
weak:
weak為弱引用,弱引用不會被持有寺擂,也不會造成對象引用計數(shù)的變化暇务,當(dāng)弱引用的對象的引用計數(shù)變?yōu)?的時候泼掠,也就是弱引用的對象銷毀的時候,weak修飾的對象會自動置為nil垦细。在這里也簡單說一下weak和assign區(qū)別的理解择镇,assign修飾的對象被釋放的時候,指針地址還是會存在的括改,也就是說并不會自動置為nil沐鼠,會造成野指針,我們知道對象的內(nèi)存是分配在堆上的叹谁,如果在后續(xù)的內(nèi)存分配中,在用到這塊內(nèi)存時程序就會蹦掉乘盖,所有我們一般使用assign修飾基礎(chǔ)數(shù)據(jù)類型焰檩,因為基礎(chǔ)數(shù)據(jù)類型是分配在棧上的,棧上的內(nèi)存是由系統(tǒng)分配管理的订框,不會造成野指針析苫。
以上,記錄下自己的理解穿扳。