【问题标题】:Using dismissModalViewControllerAnimated won't free any memory使用dismissModalViewControllerAnimated 不会释放任何内存
【发布时间】:2010-12-23 00:19:00
【问题描述】:

我有一个非常简单的代码来显示一个模态控制器(nextController 是一个类成员):

nextController = [[InstructionsScreen alloc] initWithNibName:@"InstructionsScreen" bundle:nil];
[self presentModalViewController:nextController animated:YES];
[nextController release];

然后当控制器应该隐藏时:

[self dismissModalViewControllerAnimated:YES];
nextController = nil;

一切正常,但当我运行仪器对象分配时,它显示在关闭模态控制器后,它分配的内存没有被释放。这成为一个问题,因为当我显示几个控制器时,内存已经结束了......

谁能给我一些线索? Clang 没有发现任何问题,所以我遇到了内存限制,因为被解雇的控制器的内存不会被释放。


编辑:到目前为止,我发现它似乎是 Apple 产品中某处的泄漏。重现方式:XCode -> 使用模板“Utility application”创建新项目。不要自己编写任何代码。只需创建一个新的实用程序应用程序并使用“对象分配”运行它,选择查看“已创建且仍在运行”。现在翻转模态控制器几次 - 你会看到分配的内存只会在每次模态控制器出现和消失时增长和增长......

【问题讨论】:

    标签: cocoa-touch memory-management model-view-controller


    【解决方案1】:

    据我所知,您显示的代码没有泄漏。 可能InstructionsScreen 中存在泄漏,这将阻止它被释放。

    我认为值得运行静态分析器以查看它是否发现泄漏。

    Apple 模板代码中的泄漏很有趣。可能是有泄漏。这似乎不太可能,但显然并非不可能。我会说它更有可能是仪器中的误报,这就是我建议使用静态分析器的原因。

    (您可能想提出有关泄漏的错误报告。)

    【讨论】:

      【解决方案2】:

      模态视图不是调用视图的子视图,而是应用程序窗口的子视图,并由窗口本身保留。通常,您不会在调用它们的控制器中保留对它们的引用。相反,调用模态视图,然后通过将控制器定义为模态视图的委托,使其与控制器通信。

      我认为,如果您使用 synthesize 为使用retain 定义的nextController 属性创建访问器,那么访问器将保留分配给该属性的任何对象。只需将值设置为nil 将不会释放对象,除非访问器设置为这样做,我认为自动生成的不会释放对象。

      在设置为零之前,您必须明确地调用release

      如果这不起作用,请发布您定义 nextController 属性的代码。

      【讨论】:

      • 正如我所说的 nextController 是一个成员,而不是一个属性:@interface MainScreenViewController : UIViewController{ id nextController;使用“release”而不是将 nextController 分配给“nil”会导致异常:消息 viewDidDisappear: sent to freed object。对象似乎已被释放,但“已创建且仍然存在”的对象分配工具显示内存使用量只会不断增长。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      相关资源
      最近更新 更多