autorelease基本使用

2021-07-25 12:02:10 字數 2374 閱讀 9547

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...