iOS基本內存管理:autorelease和autoreleasepool
作者:佚名
在內存管理的Objective-C代碼里,一個Cocoa對象存在于一個生命周期,有明確的階段。它被創建,初始化,并使用(也就是,其它對象發送消息給它)。它還可能會被保留,拷貝,或壓縮,并最終被釋放和銷毀。
1.autorelease 基本用法
- 對象執行autorelease方法時會將對象添加到自動釋放池中
- 當自動釋放池銷毀時自動釋放池中所有對象作release操作
- 對象執行autorelease方法后自身引用計數器不會改變,而且會返回對象本身
2.autorelease 的優點
- autorelease實際上只是把對release的調用延遲了,對于每一次autorelease系統只是把該對象放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有對象會被調用Release
-
因為只有在自動釋放池銷毀的時候它里面的對象才銷毀,因此不用關心對象銷毀的時間也就不用關心什么時候調用release
3.autorelease 使用注意
- 操作占用內存比較大的對象的時候不要隨便使用,擔心對象釋放的時間太遲
- 操作占用內存比較小的對象可以使用
4.atureleasepool自動釋放池
自動釋放池存儲于內存中的棧中遵循"先進后出"原則
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main(int argc, const char * argv[])
- {
- // 自動釋放池1
- @autoreleasepool {
- // 對象的釋放交給 自動釋放池去管理 不用再寫[person release]
- Person *person = [[[Person alloc] init] autorelease];
- // 再創建一個自動釋放池2
- @autoreleasepool {
- Person *person2 = [[[Person alloc] init] autorelease];
- }
- Person *person3 = [[[Person alloc] init] autorelease];
- }
- return 0;
- }
從上面的代碼可以看出:執行代碼時首先是person2對象先被銷毀,然后是外面的對象person和perons3 內存中的表現如下:
5.使用常見錯誤
- // 銷毀自動釋放池的時候 要對person再執行release操作的話 會報野指針錯誤
- @autoreleasepool {
- Person *person = [[[Person alloc] init] autorelease];
- [person release];
- }
- // 對象執行兩次autorelease意味著自動釋放池銷毀的時候 對象會執行兩次release操作 會報野指針錯誤
- @autoreleasepool {
- Person *person = [[[[Person alloc] init] autorelease] autorelease];
- }
責任編輯:閆佳明
來源:
cnblogs