再来一道面试题,在使用ARC的前提下,还有自己在代码中使用autoreleasepool的必要么?

tinyfool 发布于 2017年02月16日
无人欣赏。

模版代码里面的不算,我们还有自己手工调用autoreleasepool的必要么?为什么?在什么场景调用?

共12条回复
Evic 回复于 2017年02月16日

依旧有使用的场景, 比如在比较大的循环里,有对临时变量的操作

tinyfool 回复于 2017年02月16日

1楼 @Evic 不错,还有别的场景么?

vvusu 回复于 2017年02月16日

批量进行图片格式转换的时候...

lionlee 回复于 2017年02月16日

目前想到以下这些,纯靠记忆,可能有误:

  • 这个疑难杂症或者说选择困难还是要看回 LLVM 3.0 发布的时候,看似只是简单的去掉了 NS 这个恼人的前缀,但实际上那之后的 autoreleasepool 比之前的快了不少。
  • autoreleasepool 虽然叫这个名字,但其实是个标题党,其实它什么也不会 autorelease……这个在 Apple 的 “ Advanced Memory Management Programming Guide ”说的很明白,那 ARC 是不是更好的 garbage collection 方式呢?我觉得是,ARC 明显在 compile time 上优秀的多。
  • ARC 和 autoreleasepool 的关系是什么?在我看来并不是谁替代谁的关系,而需要看特定的场景:

    • 如一楼 @Evic 所说,在较大的 loop 里临时变量确实会有这个需求。

    • 同时因为一些历史包袱,在创建一些大型本地库的时候,还是非常需要 autoreleasepool 的。在 ARC 不够 auto 或是 release time 明显过慢的时候?另外 Swift 里已经把 autoreleasepool {} 从表面上去掉了......如果你不主动去找的话。

总之我觉得这是个历史遗留问题,但到目前这个转型期,还是 OC 和 Swift 混编的阶段,还是要对症下药, Swift 很可可以解决这个问题。比如数字计算特别多的 app 项目里,ARC 的出问题的几率就会明显比较多。

十月码 回复于 2017年02月17日

我在实际开发时遇到过不得不加的情况。当时的情景是要把一个词典的数据导入 Realm 的数据库,由于词典条目非常多,跑了一段时间后,Mac 的内存就耗尽了。使用 autoreleasepool 把单个词汇的导入代码包起来之后,内存占用就不会一直增长了。

tinyfool 回复于 2017年02月17日

5楼 @十月码 其实这是最常用的一个场景,提前释放

zhxq871653 回复于 2017年02月21日

场景1:当你有一个循环,创造了很多临时对象-在每个迭代的循环内使用autoreleasePool 块来释放内存。虽然最终迭代前后使用的内存可能是相同的,但是对于你的App而言要求的最大内存或许会通过一个巨大的因素而递减。 场景2:当你创建线程的时候。每个线程有它自己的autorelease块栈,主线程以它自己的autoreleasepool开头因为它来自于生成的代码,而对于自定义的线程而言,你必须创建你自己的autorelease pool。 对于Tiny老师的那个场景就不得而知了,autorelease pool block是一个工具,用来放弃一个对象的关系-消除它被立刻地dealloc。为什么会提前释放?提早释放是不正确的内存管理方式导致的一种问题而已,@tinyfool老师 求解释。。。。

tinyfool 回复于 2017年02月22日

7楼 @zhxq871653 其实说的就是循环啊,你仔细看 @十月码 的话,他只是没有强调导入流程是一个循环而已

zhxq871653 回复于 2017年02月22日

@tinyfool 所以说也就这二个场景,这是我能想到的,对了您那个苹果系统在安卓上的开源项目地址在哪里呢?求链接

tinyfool 回复于 2017年02月22日

9楼 @zhxq871653 还没开,有点麻烦

zhxq871653 回复于 2017年02月22日

@tinyfool 我记得去年的时候说开源啊。。。。

tinyfool 回复于 2017年02月22日

11楼 @zhxq871653 我早就想开源了,就是麻烦啊,现在仍出来,估计90%的人连编译这步都过不去

本帖有12个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]