自动释放池- Autoreleasepool

2017-05-11  本文已影响62人  _既白_

Autoreleasepool概念

autorelease:即延迟释放。本质上就是延迟调用release方法。

Autoreleasepool作用

在程序执行完毕即池子即将销毁的时候会对池子中所有调用autorelease的对象进行一次release操作。

Autoreleasepool原理

Autoreleasepool原理图

苹果官方文档解释

苹果官方文档 :
The Application Kit creates an autorelease pool on the main thread at the beginning of every cycle of the event loop, and drains it at the end, thereby releasing any autoreleased objects generated while processing an even

在开始每一个事件循环之前系统会在主线程创建一个自动释放池, 并且在事件循环结束的时候把前面创建的释放池释放, 回收内存。
当然也有让autorelease提前生效的办法:自己创建Pool并进行释放。

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSArray * array = [[NSArray alloc] init] ;
[pool drain];

上面的array就会在[pool drain]执行时被释放。不过只能是在MRC下。

autorelease pool 栈

每一个线程(包括主线程)都有一个NSAutoreleasePool栈. 当一个新的池子被创建的时候, push进栈. 当池子被释放内存时, pop出栈. 对象调用autorelease方法进入栈顶的池子中. 当线程结束的时候, 它会自动地销毁掉所有跟它有关联的池子.


autorelease pool 栈原理

autoreleasepool

我们对@autoreleasepool {}并不陌生,只要在Xcode里创建一个工程,就能看到下面这样的代码:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

main 函数的主体都被 @autoreleasepool 的Block块包在里面,也就是说,接下来所有的对象创建都在这个block里面。

那么, @autoreleasepool 的作用到底是什么呢?我们开发中可以用它来做什么呢?

NSThread、NSRunLoop 和 NSAutoreleasePool

Autoreleasepool总结

通常情况下,我们是不需要手动添加autoreleasepool的,使用线程自动维护的 autoreleasepool 就好了。

根据苹果官方文档中对 Using Autorelease Pool Blocks 的描述,我们知道在下面几种种情况下是需要我们手动添加 autoreleasepool 的:

参考文章:

iOS基础 - autorelease 和 autoreleasepool
黑幕背后的Autorelease
@autoreleasepool-内存的分配与释放

上一篇 下一篇

猜你喜欢

热点阅读