在 loop 中使用 autoreleasepool

以下情景均为 ARC 环境

情景 1:

for ( int i = 0; i < 10000000; i++) {
    NSString *str = [[NSString alloc] initWithFormat:@"dang %d", i];
}

分析:str 的默认变量内存管理语义是 __strong,在每次循环之后,会自动 release 掉。

情景 2:

for ( int i = 0; i < 10000000; i++) {
    NSString *str = [NSString stringWithFormat:@"dang %d", i];
}

分析:内存暴涨说明没有调用 objc_retainAutoreleasedReturnValue ,也就是说,stringWithFormat:返回的是一个 autorelease 对象。而此时 runloop 由于 for 循环没有结束一直处于醒着的状态,直到 for 循环结束才会倾倒自动释放池,在这过程中产生的大量的 autorelease 对象使得内存暴涨。

情景 3:

for ( int i = 0; i < 10000000; i++) {
     @autoreleasepool { 
        NSString *str = [NSString stringWithFormat:@"dang %d", i];
    }
}

分析:为了解决情景 2 中的问题,每次循环时创建一个自动释放池,临时对象可以及时 release 掉,就不会使得内存暴涨了。

总结:

什么时候使用自动释放池?

在一些博客中说的是在 loop 中 NSData 转为 UIImage 时,在一些技术群中也有不少人是这么回答的。其实这只是使用自动释放池的一种情况,归根结底是 在 loop 中通过非 alloc/new/copy/mutableCopy 方法创建对象 时使用,例如[NSMutableArray array];[UIImage imageWithData:data];,这些方法创建的 autorelease 对象需要放在 pool 中及时释放掉。

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

相关阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,419评论 30 472
  • 11.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什...
    AlanGe阅读 4,130评论 1 4
  • 内存管理 ARC处理原理 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做...
    b485c88ab697阅读 13,840评论 3 47
  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    恒爱DE问候阅读 10,814评论 0 9
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...
    JW_T阅读 3,318评论 0 1

友情链接更多精彩内容