autorelease是一種支援引用計數的記憶體管理方式, 只要給物件傳送一條autorelease訊息, 會將物件放到乙個自動釋放池中, 當自動釋放池被銷毀時,會對池子裡面的所有物件做一次release操作
注意, 這裡只是傳送release訊息, 如果當時的引用計數(reference-counted)依然不為0, 則該物件依然不會被釋放。
autorelease方法會返回物件本身
person *p =[person new];
p = [p autorelease];
呼叫完autorelease方法後,物件的引用計數器不變
person *p = [person new];
p = [p autorelease];
nslog(@"count = %lu", [p retaincount]); // count = 1
autorelease的好處:
不用再關心物件釋放的時間,不用再關心什麼時候呼叫release
autorelease的原理:
autorelease實際上只是把對release的呼叫延遲了, 對於每乙個autorelease, 系統只是把該 object放入了當前的autorelease pool中, 當該pool被釋放時, 該pool中的所有object會被呼叫release。
建立自動釋放池格式:
ios 5.0前
nsautoreleasepool *pool = [[nsautoreleasepool alloc] init]; // 建立自動釋放池
[pool release]; // [pool drain]; 銷毀自動釋放池
ios 5.0 後
@autoreleasepool
// 本行結束代表銷毀自動釋放池
在ios程式執行過程中,會建立無數個池子。這些池子都是以棧結構存在(先進後出)
當乙個物件呼叫autorelease方法時,會將這個物件放到棧頂的釋放池
nsautoreleasepool *autoreleasepool = [[nsautoreleasepool alloc] init];
person *p = [[[person alloc] init] autorelease];
[autoreleasepool drain];
// 或者
@autoreleasepool
// 銷毀自動釋放池(會給池子中所有物件傳送一條release訊息)
並不是放到自動釋放池**中, 都會自動加入到自動釋放池
@autoreleasepool
在自動釋放池的外部傳送autorelease 不會被加入到自動釋放池中
autorelease是乙個方法,只有在自動釋放池中呼叫才有效。
@autoreleasepool
// 錯誤寫法:沒有與之對應的自動釋放池, 只有在自動釋放池中呼叫autorelease才會放到釋放池
person *p = [[[person alloc] init] autorelease];
[p run];
// 正確寫法
@autoreleasepool
// 正確寫法
person *p = [[person alloc] init];
@autoreleasepool
自動釋放池是以棧的形式存在
由於棧只有乙個入口, 所以呼叫autorelease會將物件放到棧頂的自動釋放池
棧頂就是離呼叫autorelease方法最近的自動釋放池
// 棧底自動釋放池
@autoreleasepool
person *p = [[[person alloc] init] autorelease];
}}
自動釋放池中不適宜放占用記憶體比較大的物件
盡量避免對大記憶體使用該方法,對於這種延遲釋放機制, 還是盡量少用
不要把大量迴圈操作放到同乙個 @autoreleasepool 之間, 這樣會造成記憶體峰值的上公升
// 記憶體暴漲
@autoreleasepool
}// 記憶體不會暴漲
for (int i = 0; i < 99999; ++i)
}
不要連續呼叫autorelease
@autoreleasepool
呼叫autorelease後又呼叫release
@autoreleasepool
autorelease 的基本使用
5 autorelease 的基本使用 0,引入 person p persom new p release p run p run 希望不立即釋放,待 run執行完後再釋放 1,自動釋放池簡介及 autorelease 簡介自動釋放池1 在 ios 執行過程中 會建立無數個池子 這些池子都是以棧的...
autorelease的使用場景
autorelease 就是把 release 延後到 autorelease pool drain 的時候。是 arc 進行引用計數管理機制中的一部分,挺巧妙的。其它還有 weak 指標等都是為了管理好記憶體設計的機制。主要是可以用在非 alloc copy new等函式的返回值上面。可以對應解決...
十二 oc中autorelease的基本使用
windows phone 7手機開發 ios培訓 期待與您交流!在前面的記憶體管理部落格中,提到過release方法,它是乙個物件方法,返回的是空值。autorelease方法也有著release方法有著大體相同的作用。注意 autoreleasepool這是oc中的乙個關鍵字,而autorele...