一、記憶體管理規則
1、對於通過呼叫帶有alloc、copy、mutablecopy、new或者create一詞的方法建立的任何物件及其記憶體,你都擁有所有權。你負責在之後的某個時刻向該物件傳送release訊息來釋放資源。使用類似[[foo alloc]init...]命令建立的物件需要釋放。任何使用類似[foo copy]方法建立的物件需要釋放。任何和createfoo()類似的呼叫所返回的物件也需要釋放。
2、對於通過不帶上述詞的方法呼叫獲得的物件,你都沒有所有權。這些物件可以再當前執行棧中任意呼叫,離開當前棧之後,這些物件就不可用了。
通過其他方法呼叫的物件通常是「自動釋放」物件,自動釋放物件會在應用程式下次離開執行迴圈時被釋放。
二、使用自動釋放舉例:
1、返回乙個自動釋放物件
-(foo *)getfoo
foo *foo = [[foo alloc]init];
//對foo執行一些操作
return [foo autorelease];
2、alloc/autorelease物件
-(void)somemethod
foo *foo = [[[foo alloc]init]autorelease];
//在這裡foo仍然有效
//在方法退出之前不會釋放
[foo dosomething];
三、使用自動釋放可能耗盡記憶體
在自動釋放池中留有大量物件
-(void)inflatememoryusage
for(nsuinteger n = 0; n<100000; ++n)
//物件是自動釋放的
nsdata *data = [self getbigblockofdata];
//對資料進行處理
[self dostuff:data];
//在這裡100000個資料物件都還有效
解決方法:
1、在迴圈中釋放物件
-(void)inflatememoryusage
for(nsuinteger n=0; n < 100000; ++n)
//保留計數是1
nsdata *data = [[nsdata alloc]init];
[self putblobofdataintodata:data];
//使用建立的物件
//處理資料
[self dostuff:data];
[data release];//物件在這裡被釋放
//沒有遺留任何東西
2、在必須使用很多自動釋放物件的情況下,在迴圈內部建立乙個自動釋放池,在使用完**中的物件後,清空自動釋放池並釋放物件。
-(void)inflatememoryusage
for(nsuinteger n = 0; n<100000; ++n)
//物件是自動釋放的
nsdata *data = [self getbigblockofdata];
//對資料進行處理
[self dostuff:data];
//在這裡100000個資料物件都還有效
解決方法:
1、在迴圈中釋放物件
-(void)inflatememoryusage
for(nsuinteger n=0; n < 100000; ++n)
nsautoreleasepool *pool = [[nsautoreleasepool alloc]init];
//該物件是自動釋放的
nsdata *data = [self getbigblobofdata];
//對data進行些處理
[self dostuff:data];
[pool release];//自動釋放物件在這裡釋放,使用drain或release
//沒有遺留任何物件
自動釋放池中自動釋放物件被推入到可用的最高層的自動釋放池,這點和巢狀棧有些類似。所以如果在乙個自動釋放池內建立多個池,在清空池子時只有最裡面的自動釋放池內的自動釋放物件被釋放。
objc 記憶體管理
1.在oc中,物件也具有生命週期。其也有產生 生存 接受訊息和執行操作 交友 借助方法的組合和引數 死去等屬性。2.cocoa採用引用計數 reference counting 技術,來判斷該物件是否達到生命週期終結。當某段 需要訪問乙個物件時,該物件的reference counting 加一,當...
Obj C記憶體管理(二)
autorelease的本質就是呼叫 nsautoreleasepool的addobject方法 imp caching 方法呼叫的實現 id autorelease class nsautoreleasepool class sel autorelease sel selector addobje...
記憶體管理 記憶體管理概述
儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...