基本内存管理:在dealloc方法中调用[super dealloc]

时间:2011-08-12 13:22:41

标签: objective-c ios xcode memory-management dealloc

如果我有一个由视图控制器控制的视图堆栈,并且当我从视图堆栈弹出视图时调用了视图的dealloc(包含[super dealloc])方法,这是否意味着我没有必要释放创建它的视图控制器?

我问,因为我最初是在创建后释放视图并将它们推送到导航控制器,除非我在包含[viewController release]时不断出现“过度释放”错误。没有该声明,导航控制器工作正常,XCode中的分析功能不会抱怨潜在的内存泄漏。

非常感谢任何形式的解释!

编辑:发生这种情况的一个例子

 OnePlaceViewController *mapView = [[OnePlaceViewController alloc] initWithNibName:nil bundle:nil];

[self.navigationController pushViewController:mapView animated:YES];

通常情况下,在推送到导航控制器之后我会调用[mapView release](无论如何我对内存管理的理解),但是如果我在那里保留线路,我最终会在我的应用程序中崩溃。< / p>

3 个答案:

答案 0 :(得分:1)

您永远不会直接致电-dealloc。唯一接近的是对[super dealloc]的调用,而且只能在您自己的dealloc中调用。如果您直接致电dealloc,您应该会在以后发生崩溃。

如果你想说[viewController release],那表明你在保留和释放的某个地方不匹配。你应该释放你保留的东西。有关更多说明和完整文档的链接,请参阅Three Magic Words。他们并不难,但你必须始终如一地遵循它们。

编辑如果您分配,则应在完成对象后释放。这并不意味着“当对象应该被销毁时”。这意味着“当完成对象时。”如果系统的其他部分仍然需要该对象,他们将保留它。保留你想要的东西,释放你所做的事。

在您的示例中,您应该release mapView。你把它交给了导航控制器,现在你已经完成了它。如果你在释放它时崩溃,你可能会在其他地方过度释放。最可能的地方是OnePlaceViewController的ivars之一,或其中一个拥有对象的ivars。

从静态分析器(Xcode 4中的Cmd-Shift-B)开始,看看是否发现过度释放。但是,它并没有很好地找到伊娃过度发布。然后,确保始终使用访问者,initdealloc除外(init是有争议的)。直接访问您的ivars是导致内存管理混乱的首要原因,这是导致崩溃的首要原因。

不要随意插入和删除保留和释放。你会把自己捆绑在一起。如果你修复了崩溃,你就会泄漏。当您修复泄漏时,您将崩溃。你必须找到错误并修复它。在升级到包含ARC的系统之前没有解决方法(此时所有这些都神奇地消失了......)

答案 1 :(得分:1)

首先,您应该阅读Apple的内存管理编程指南。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

其次,你永远不应该直接调用[anObject dealloc]。 dealloc方法中的[super dealloc]例外。您将使用release,并在对应时自动释放。

再次,遵守Apple的内存管理规则,你会很好

答案 2 :(得分:1)

有几件事:

1)在将视图控制器推送到导航控制器或任何其他“容器”视图控制器之后,您应始终release,因为这些控制器将retain在您只是{{1}的视图控制器上}编辑。例外情况是,如果要将视图控制器存储在ivar中以供日后使用,在这种情况下应保留保留。在这种情况下,您可能会遇到过度发布的崩溃,因为alloc的{​​{1}}方法中的某些内容被过度释放。检查那个没有保留的对象的方法。

2)使用“视图”和“视图控制器”时要小心。视图是绘图空间的抽象,视图控制器是包含管理视图的逻辑的对象。如果您正在使用IB并通过nib(您看起来像是)分配视图控制器,那么应​​该自动处理该视图控制器的所有视图内存管理。除了OnePlaceViewController中的视图之外,我会仔细查看您正在使用的任何对象,以查看是否有任何内容被释放两次。