【问题标题】:What is the connection of autorelease pool to garbage collection?自动释放池与垃圾收集有什么联系?
【发布时间】:2012-03-29 17:27:59
【问题描述】:

我从苹果文档中读到了这篇文章..

在垃圾收集环境中,释放是无操作(无操作指令)。因此,NSAutoreleasePool 提供了一个 drain 方法,它在引用计数环境中的行为与调用 release 相同,但在垃圾收集环境中会触发垃圾收集(如果自上次收集后分配的内存大于当前阈值)。因此,通常应该使用 drain 而不是 release 来处理自动释放池。

但没有理解的意思

1) “如果自上次收集后分配的内存大于当前阈值。”

2) ios 不支持垃圾收集器,那么垃圾收集器的排水管有什么用?

【问题讨论】:

标签: iphone objective-c ios garbage-collection autorelease


【解决方案1】:

1) 大概意思是GC记住了分配的内存量,下次调用drain时将分配的内存量与上一次比较。仅当更改足够显着时才会进行垃圾收集。

让我换一种方式来解释:垃圾收集可能很昂贵,因此您需要决定何时收集。为了避免不必要的工作,GC 可能会记住一次收集运行后的内存量(例如,使用了 25MB)。现在 GC 下一次考虑收集时,它首先决定是否值得做所有的工作。例如,如果现在使用的内存量是 25.5MB,那么它可能不值得做任何事情。但是如果现在 50MB 正在使用中,那么收集就很有用了。

2) 这个东西起源于 Mac,在那里 GC 可用。为了在 iOS 和 Mac OS X 之间实现代码共享,这些看似不必要的方法仍然存在于 iOS 上,以尽可能与 Mac OS X 保持兼容。我什至怀疑这是因为 iOS 实际上是 Mac OS X 的“分支”,因此继承了这些东西。

【讨论】:

  • 并且对于 2) drain 仅在需要在 ios 和 mac 之间共享代码时才有用?
  • ane for 1) 当我调用 Drain 时,它会将内存与最后一个内存进行比较,或者它会删除那些内存?
  • @PJR: drain 也是使用 ARC 销毁自动释放池的唯一选择(尽管现在您可能会使用 @autoreleasepool 指令)。
  • @PJR:不,它不是在比较内存。 GC在做什么,我不知道。但是文档表明它记住了使用的内存量,并将该数字与当前使用的内存量进行比较。只有当差异足够大时,GC 才会开始清理“废弃”对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2011-12-05
  • 2014-12-07
相关资源
最近更新 更多