1.爲什麼要管理內存
系統資源有限,會爲每個程序分配30M的內存,超過20M會收到內存警告,超過30M,sorry系統將會終止你的應用程序。
1)內存管理機制
ObjC中提供了一個機制來實現上面提到的這個邏輯模型,它被稱爲“引用計數”(retain counting):
每一個對象都有一個引用計數(retain count)
對象被創建的時候,引用計數的值是1
當引用計數值是0的時候,對象將被系統統一銷燬(調用delloc方法)
[receiver retainCount]得到retainCount的值
2)獲得所有權的方法:
alloc:爲一個新對象分配內存,並且它的引用計數爲1。調用alloc方法,你便有對新對象的所有權
copy:製造一個對象的副本,該副本的引用計數爲1,調用者具有對副本的所有權
retain:使對象的引用計數加1,並且獲得對象的所有權
3)放棄所有權的方法:
release:使對象的引用計數減1,並且放棄對象的所有權
autorelease:使對象的引用計數在未來的某個時候(自動釋放池release的時候)減1,並且在那個時候放棄對象的所有權
2.內存管理原則
對你自己擁有的對象負責,你只能釋放你擁有的對象
凡是通過retain,alloc,copy等手段獲得了所有權的對象,都必須在你不在使用他的時候,由你來調用release,autorelease等手段來釋放對他的所有權
在一定的代碼段內,對同一個對象所做的 copy,alloc和retain的操作次數應當與release和 autorelease操作的次數相等
可以在類的dealloc方法中釋放你所佔有的實例變量
對於便利構造器和訪問起來說,你沒有通過上面的這些手段獲得對象的所有權,因此在這些情況下你無須對獲得對象進行額外的釋放操作
autorelease只不過意味着“預定延遲發送一條release消息”,當前的引用計數器並沒有變
1)屬性與內存管理
.h文件
@property(retain,non
atomic)NSString *name; //name聲明的屬性是retain才需要在delloc中release
.m文件
@synthsize name = _name
-(void)dealloc
{
[name release]; //釋放屬性
[super dealloc];
}
2)便利構造器內存管理
自動釋放池 (autoreleasepool)
只要對象用autorelease,他就被加到自動釋放池當中
當自動釋放池release加入到自動釋放池的對象就會release,自動釋放池也會銷燬而drain是把釋放池裏的對象release釋放池還在
autorelease比較少用,⼀一般都是在便利構造器裏使用
IOS5 新加的 ARC(自動內存釋放)