天天看点

iOS Autorelease Pool (自动释放池)

####我们都知道在内存管理中有2种释放内存,一种是[ objc release] 直接释放 还有一种是 [objc autorelease].当对象调用autorelease时,会将对象加入自动释放池中。自动释放池会在将来的某一时刻将存在池中的对象释放掉。清空自动释放时,系统会向其中的对象发送release消息。

我们知道自动释放池就是把其作用域里调用autorelease的对象存放的地方,在将来的某一时刻将存在池中的对象释放掉。那么他有什么作用呢?

一般不用我们创建自动释放池,主线程和gcd默认都有自动释放池。

用于容纳UIApplicationMain函数所自动释放的那些对象
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
复制代码
           

####1.降低内存峰值

NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i = 0; i < 10000; i++) {
        
        NSString *str = [NSString stringWithFormat:@"123"];
        [array addObject:str];
    }
复制代码
           

上述代码里的str临时变量 arc会帮我们自动释放池中,等下时机释放。但我们在短时间内往里面加入太多,会导致内存猛增.所以我们可以这样

NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i = 0; i < 10000; i++) {
        
        @autoreleasepool {
         
            NSString *str = [NSString stringWithFormat:@"123"];
            [array addObject:str];
        }
    }
复制代码
           

这样写str放入我们新创建的自动释放池中,当走到块末尾,会清空池中的对象,降低内存峰值。当然一般只要不是消耗太大,不建议这样写,毕竟创建自动释放池也是有消耗的

转载于:https://juejin.im/post/5a31f19f6fb9a044fd11c73e

继续阅读