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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容