使用dismissModalViewControllerAnimated不会释放任何内存

时间:2009-12-03 21:15:40

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

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

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

然后当控制器隐藏时:

[self dismissModalViewControllerAnimated:YES];
nextController = nil;

所有工作都按预期工作,但是当我运行仪器对象分配时,它显示在解除模态控制器后,它所分配的内存不会被释放。这成为一个问题,因为当我显示几个控制器时,内存已经结束......

有人可以给我一些线索吗? Clang没有看到任何问题,所以我卡住了内存限制,因为被解雇的控制器的内存不会被释放。


编辑:我到目前为止发现的是,它似乎是苹果公司的某个地方的漏洞。重现方式:XCode - >使用模板“Utility application”创建新项目。不要自己编写任何代码。只需创建一个新的实用程序应用程序并使用“对象分配”运行它,选择查看“创建和静止生活”。现在翻转模态控制器几次 - 你会看到分配的内存只会在模态控制器出现时以及当它消失时才会增长和增长......

2 个答案:

答案 0 :(得分:1)

据我所见,您显示的代码中没有泄漏。 可能InstructionsScreen中的泄漏,会阻止它被解除分配。

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

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

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

答案 1 :(得分:0)

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

我认为如果使用synthesize为nextController定义的retain属性创建访问器,则访问者将保留分配给该属性的任何对象。简单地将值设置为nil将不会释放对象,除非访问器设置为执行此操作而我不认为自动生成的对象。

在设置为nil之前,您必须先致电release

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