iOS中autoreleasepool的理解和使用

自动释放池block,苹果官方文档:Using Autorelease Pool Blocks

面试经常会有这样的问题:
1.什么是@autoreleasepool?
2.里面对象的内存什么时候释放?
3.什么时候要用@autoreleasepool?

回答:

1.@autoreleasepool是自动释放池,让我们更自由的管理内存

2.当我们手动创建了一个@autoreleasepool,里面创建了很多临时变量,当@autoreleasepool结束时,里面的内存就会回收

3.ARC时代,系统自动管理自己的autoreleasepool,runloop就是iOS中的消息循环机制,当一个runloop结束时系统才会一次性清理掉被autorelease处理过的对象,其实本质上说是在本次runloop迭代结束时清理掉被本次迭代期间被放到autorelease pool中的对象的。至于何时runloop结束并没有固定的duration。
方便是方便了,但是有些情况下,我们还是需要手动创建自动释放池,那么,什么时候呢?

  • 如果你正在编写不基于UI 框架的程序,比如命令行工具。
  • 如果你编写的循环创建了很多临时对象。
    你可以在循环中使用自动释放池block,在下次迭代前处理这些对象。在循环中使用自动释放池block,有助于减少应用程序的内存占用。
  • 你生成了一个辅助线程。
    一旦线程开始执行你必须自己创建自动释放池。否则,应用将泄漏对象。

这是苹果文档中的翻译,按我的理解,最重要的使用场景,应该是有大量中间临时变量产生时,避免内存使用峰值过高,及时释放内存的场景。
举个例子

NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
    @autoreleasepool {
        NSError *error;
        NSString *fileContents = [NSString stringWithContentsOfURL:url
                                         encoding:NSUTF8StringEncoding
                                         error:&error];
    }
}

这个for循环里如果不使用@autoreleasepool,那临时变量内存可能是爆发式的,但是使用了@autoreleasepool,在每个@autoreleasepool结束时,里面的临时变量都会回收,内存使用更加合理。

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

相关阅读更多精彩内容

  • 一、什么是runloop 字面意思是“消息循环、运行循环”。它不是线程,但它和线程息息相关。一般来讲,一个线程一次...
    WeiHing阅读 8,324评论 11 111
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,646评论 30 472
  • 好记性不如烂笔头,勿在浮沙筑高台,不积跬步无以至千里,做人做事要有安排有计划。 内存管理一直是学习 Objecti...
    BigLuckyHaha阅读 7,162评论 9 19
  • 文‖苍穹一君 明天我要去打架了 今夜群魔乱舞 今夜我的斯文尽失 明天我要去打架了 没有伙伴同行 没有工具可用 明天...
    苍穹一君阅读 375评论 15 12
  • 从vcxvx
    damaox阅读 139评论 0 1

友情链接更多精彩内容