什么可能导致Release和Debug配置之间不同的ObjC / ARC内存行为?

时间:2014-04-28 07:43:29

标签: objective-c automatic-ref-counting instruments

我正在运行一个测试,通过将相关代码段包装在10秒长的循环中来确保正确释放对象。我在调试和发布配置中运行测试,结果不同。

调试(在模拟器中构建和运行):

Debug

发布(在设备上构建和运行,以及使用工具进行配置文件):

Release

CPU峰值表示创建和销毁对象的位置(每次运行中有3个)。请注意,在Debug构建中,内存使用率在繁忙循环期间逐渐上升,然后在更高的基本级别稍后结算,这发生在每次循环迭代中。在Release版本中,它始终保持不变。在3次运行结束后,Debug构建的内存使用级别明显高于Release构建的内存使用级别。 (CPU峰值在时间轴上相对于彼此偏移,但这只是因为我按下了在不同时间触发循环的按钮)。

有问题的内循环代码非常简单,基本上由一堆正确配对的mallocfree语句以及一堆retainrelease个调用组成(由ARC提供,也经过验证,正确配对)。

知道是什么导致了这种行为吗?

3 个答案:

答案 0 :(得分:3)

在发布版本中,ARC将尽力将对象保留在自动释放池之外。它使用objc_returnsRetainAutorelease并在运行时检查它。

答案 1 :(得分:0)

许多Cocoa-Touch类使用缓存来提高性能。用于缓存数据的内存量可能因总内存,可用内存和其他一些内容而异。由于您比较Mac和设备的结果,因此您收到不同的结果并不奇怪。

使用缓存的类/方法的一些示例:

  

+(UIImage *)imageNamed:(NSString *)name

     

讨论

     

此方法在系统缓存中查找具有指定名称和的图像对象   返回该对象(如果存在)。如果匹配的图像对象不是   已经在缓存中,此方法从中加载图像数据   指定文件,缓存它,然后返回结果对象。

     

<强> NSURLCache

     

NSURLCache类实现对响应的缓存   通过将NSURLRequest对象映射到的URL加载请求   NSCachedURLResponse对象。它提供了一个复合内存和   磁盘缓存

答案 2 :(得分:0)

首先,版本构建优化代码并从代码中删除调试信息。因此,应用程序包明显更小并且加载它,需要更少的内存。

我认为Debug版本中大部分已用内存是实际调试信息,僵尸跟踪等。

相关问题