自动释放池与垃圾收集有啥联系?
Posted
技术标签:
【中文标题】自动释放池与垃圾收集有啥联系?【英文标题】:What is the connection of autorelease pool to garbage collection?自动释放池与垃圾收集有什么联系? 【发布时间】:2012-03-29 17:27:59 【问题描述】:我从苹果文档中读到了这篇文章..
在垃圾收集环境中,释放是无操作(无操作指令)。因此,NSAutoreleasePool 提供了一个 drain 方法,它在引用计数环境中的行为与调用 release 相同,但在垃圾收集环境中会触发垃圾收集(如果自上次收集后分配的内存大于当前阈值)。因此,通常应该使用 drain 而不是 release 来处理自动释放池。
但没有理解的意思
1) “如果自上次收集后分配的内存大于当前阈值。”
和
2) ios 不支持垃圾收集器,那么垃圾收集器的排水管有什么用?
【问题讨论】:
老兄,我能有那个链接吗?我想自己读一下。 是的,上瘾你可以找到它developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 【参考方案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 才会开始清理“废弃”对象。以上是关于自动释放池与垃圾收集有啥联系?的主要内容,如果未能解决你的问题,请参考以下文章