如果我有一个由视图控制器控制的视图堆栈,并且当我从视图堆栈弹出视图时调用了视图的dealloc(包含[super dealloc]
)方法,这是否意味着我没有必要释放创建它的视图控制器?
我问,因为我最初是在创建后释放视图并将它们推送到导航控制器,除非我在包含[viewController release]
时不断出现“过度释放”错误。没有该声明,导航控制器工作正常,XCode中的分析功能不会抱怨潜在的内存泄漏。
非常感谢任何形式的解释!
编辑:发生这种情况的一个例子
OnePlaceViewController *mapView = [[OnePlaceViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:mapView animated:YES];
通常情况下,在推送到导航控制器之后我会调用[mapView release]
(无论如何我对内存管理的理解),但是如果我在那里保留线路,我最终会在我的应用程序中崩溃。< / p>
答案 0 :(得分:1)
您永远不会直接致电-dealloc
。唯一接近的是对[super dealloc]
的调用,而且只能在您自己的dealloc
中调用。如果您直接致电dealloc
,您应该会在以后发生崩溃。
如果你想说[viewController release]
,那表明你在保留和释放的某个地方不匹配。你应该释放你保留的东西。有关更多说明和完整文档的链接,请参阅Three Magic Words。他们并不难,但你必须始终如一地遵循它们。
编辑如果您分配,则应在完成对象后释放。这并不意味着“当对象应该被销毁时”。这意味着“当你完成对象时。”如果系统的其他部分仍然需要该对象,他们将保留它。保留你想要的东西,释放你所做的事。
在您的示例中,您应该release
mapView
。你把它交给了导航控制器,现在你已经完成了它。如果你在释放它时崩溃,你可能会在其他地方过度释放。最可能的地方是OnePlaceViewController
的ivars之一,或其中一个拥有对象的ivars。
从静态分析器(Xcode 4中的Cmd-Shift-B)开始,看看是否发现过度释放。但是,它并没有很好地找到伊娃过度发布。然后,确保始终使用访问者,init
和dealloc
除外(init
是有争议的)。直接访问您的ivars是导致内存管理混乱的首要原因,这是导致崩溃的首要原因。
不要随意插入和删除保留和释放。你会把自己捆绑在一起。如果你修复了崩溃,你就会泄漏。当您修复泄漏时,您将崩溃。你必须找到错误并修复它。在升级到包含ARC的系统之前没有解决方法(此时所有这些都神奇地消失了......)
答案 1 :(得分:1)
首先,您应该阅读Apple的内存管理编程指南。
其次,你永远不应该直接调用[anObject dealloc]。 dealloc方法中的[super dealloc]例外。您将使用release,并在对应时自动释放。
再次,遵守Apple的内存管理规则,你会很好
答案 2 :(得分:1)
有几件事:
1)在将视图控制器推送到导航控制器或任何其他“容器”视图控制器之后,您应始终release
,因为这些控制器将retain
在您只是{{1}的视图控制器上}编辑。例外情况是,如果要将视图控制器存储在ivar中以供日后使用,在这种情况下应保留保留。在这种情况下,您可能会遇到过度发布的崩溃,因为alloc
的{{1}}方法中的某些内容被过度释放。检查那个没有保留的对象的方法。
2)使用“视图”和“视图控制器”时要小心。视图是绘图空间的抽象,视图控制器是包含管理视图的逻辑的对象。如果您正在使用IB并通过nib(您看起来像是)分配视图控制器,那么应该自动处理该视图控制器的所有视图内存管理。除了OnePlaceViewController
中的视图之外,我会仔细查看您正在使用的任何对象,以查看是否有任何内容被释放两次。