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

Mos*_*she 6 memory-management objective-c 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;
  }


}
Run Code Online (Sandbox Code Playgroud)

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

有些事情需要注意:

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

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

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

仪器没有报告任何泄漏,但平稳期关注我.

什么可能导致内存增加?

编辑:

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

在此输入图像描述

哪里可能坚持这些观点?

ser*_*gio 2

对于您所看到的内容的一种可能的解释是 UIKit (我认为)正在对您的对象进行一些缓存(不知道它们是什么,但我主要想到的是图像)。

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

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

至于如何向设备(而不是模拟器)发送内存警告,您可以在这里找到一篇有用的SO 帖子