如何了解 iOS 上 autoreleasepools 的内容?
Posted
技术标签:
【中文标题】如何了解 iOS 上 autoreleasepools 的内容?【英文标题】:How to find out about the contents of autoreleasepools on iOS? 【发布时间】:2013-12-19 00:13:17 【问题描述】:我希望减少我的应用程序的内存使用量,我们可能会浪费内存的一个地方是我们使用自动释放池。我认为我们现在在任何合适的地方都有它们,但我不确定,所以我想在战略点进行一些测量,看看是否有更多的 @autoreleasepool 块有用。
我进行了一些研究,发现了以下调查自动释放池的方法,这些方法在过去可能有效,但显然不再有效,至少在 XCode 5 中:
+[NSAutoreleasePool showPools]
- 这旨在打印有关活动自动释放池的信息,但似乎不再做任何事情 - XCode 认为这不是一件事
_objc_autoreleasePoolPrint
- 我在堆栈溢出时发现了一些对该函数的引用,但 XCode 坚持认为它不存在,并且如果我将其声明为 extern 则不会链接它
我们的代码库足够大,以至于在任何地方都粘贴额外的自动释放池将是一件愚蠢的事情,所以我正在寻找一种方法来找出在任何特定时间“池中”有多少对象。这样我就可以在少数需要它们的地方添加更多的水池,而不是到处乱扔。
如果我必须在 Instruments 或调试器中找到它,那不是问题 - 这只是我们用于测试的东西,不会在发布时发布。
感谢您的帮助!
【问题讨论】:
尝试将弱导入属性 (__attribute__((weak_import))
) 添加到 _objc_autoreleasePoolPrint
extern。
同样的链接器错误,很遗憾。 :(
【参考方案1】:
在这种情况下使用 Instruments 是一个好主意,因为它会提供大量额外信息,帮助您更好地了解应用的内存使用情况。作为一般性介绍,我推荐2013 WWDC
的会话修复内存问题另外,here 是指向答案的链接,其中包含一些很好的额外提示
如果您真的想检查某些特定代码段中的内存使用情况,您可以添加一些 NSLog() 以在控制台中打印时间戳并使用它们来查找图表中的间隔,但我发现最好只将数据视为一个整体,并尝试实现尽可能统一的内存图,自动释放池可以通过更均匀地分布使用来帮助实现这一点。
【讨论】:
以上是关于如何了解 iOS 上 autoreleasepools 的内容?的主要内容,如果未能解决你的问题,请参考以下文章