C风格块可以导致内存泄漏吗?

时间:2011-08-01 18:50:21

标签: objective-c memory-management objective-c-blocks

我正在使用自助服务终端风格的幻灯片应用。我有一个显示幻灯片的UIScrollView和一个生成幻灯片的工厂类。 “幻灯片”本身是UIViewController子类,它们从XIB文件加载并由工厂类定制。在我的主视图控制器中,我设置了滚动视图并启动了一个计时器。计时器每隔N秒调用一次“重载”方法,处理重新加载并调用工厂类。

工厂类使用的方法如下所示:

- (SlideViewController *)slideFromManagedObject:(Slide *)managedObject{

  NSInteger slideType = [managedObject slideType];

  switch(slideType){
     case kSlideTypeA:

  { 
       //
       //  configure arguments here
       //

       return [[SlideViewController alloc] initWithArgument:argument] autorelease];
         break;

  }

    //
    //  More types here...
    //

    default:
      break;
  }


}

我尚未达到定义所有案例的程度,但填写的案例似乎导致jumps in memory usage。如果我在切换/大小写之前添加return [[[UIViewController alloc] init] autorelease];,我没有按预期看到可见的视图,但我也没有看到这些内存增加。我不确定,但我怀疑这是我正在包装我的幻灯片生成代码的“C块”。

有些注意事项:

  • 当应用程序启动时,我看到内存平台从大约400千字节到大约两倍。然后,当幻灯片进行时,调用其生成代码包含在花括号中的任何幻灯片,内存平台再次向上。

  • 这种行为似乎每次发布只发生一次 - 当应用程序循环遍历所有幻灯片时,平台再次发生。 然而如果应用程序背景然后重新启动,则会再次出现平台,甚至消耗更多内存。

  • 当我离开应用程序过夜,大约10小时40分钟后,内存使用量从大约1.44兆字节缓慢上升到接近1.57兆字节的某个位置。我怀疑其中有一些其他泄漏可能已经通过我的调整来解决,但是从大约800千字节到1.4到1.5兆字节之间的主要跳跃仍然是一个问题。

仪器没有报告任何泄漏,但平稳时间让我感到担忧。

什么可能导致记忆增加?

修改

所以我不认为这是块,因为使用if / else似乎做同样的事情。 以下是Allocations仪器运行的屏幕截图:

enter image description here

哪些可能会坚持这些观点?

1 个答案:

答案 0 :(得分:2)

你所看到的一个可能的解释是UIKit(我假设)正在对你的对象做一些缓存(不知道它们是什么,但我主要想到的是图像)。

缓存通常在过渡期间和UIKit的其他内部使用。

UIKit通常会在收到内存警告时清空其缓存,因此您可以尝试发送一个以查看会发生什么。实际上,我怀疑发送内存警告的结果不是很容易分析,因为你的所有视图都被卸载了,因此内存会强行下降。但你可以试试......

关于如何向设备发送内存警告(而不是模拟器),您可以在这里找到有用的S.O. post