如何了解 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 的内容?的主要内容,如果未能解决你的问题,请参考以下文章

Linux基础IO——文件系统(上)

遇到网络错误时如何在iOS上调试Axios?

如何使用 swift 在 IOS 地图上叠加图像

iOS程序员如何快速上手一个新项目?

如何在 iOS 设备上调整图像大小?

从概念上讲如何在ios中的图像上写[关闭]