gpt4 book ai didi

objective-c - 基本内存管理 : Calling [super dealloc] in dealloc method

转载 作者:行者123 更新时间:2023-12-01 19:26:35 26 4
gpt4 key购买 nike

如果我有一个由 View Controller 控制的 View 堆栈,并且当我从 View 堆栈中弹出 View 时调用了 View 的 dealloc(包含 [super dealloc] )方法,这是否意味着我不必释放 View Controller 它被创造了?

我问是因为我最初是在创建后释放 View 并将它们推送到导航 Controller ,除了当我包含 [viewController release] 时我不断收到“过度释放”错误。 .如果没有该声明,导航 Controller 可以正常工作,并且 XCode 中的分析函数不会提示潜在的内存泄漏。

任何形式的解释将不胜感激!

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

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

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

通常我会调用 [mapView release]在我推送到导航 Controller 之后(无论如何,根据我对内存管理的理解),但如果我将线路保留在那里,我最终会在我的应用程序中崩溃。

最佳答案

你永远不会调用 -dealloc直接地。唯一接近的是对 [super dealloc] 的调用。 ,并且只能在您自己的 dealloc 中调用.如果您调用dealloc直接,您应该期待稍后发生崩溃。

如果你想说[viewController release] ,那么这表明您在保留和释放的某处不匹配。你应该释放你保留的东西。见 Three Magic Words更多解释和完整文档的链接。它们并不难,但你必须始终如一地遵循它们。

编辑 如果你分配,你应该在你完成对象时释放。这并不意味着“什么时候应该销毁对象”。这意味着“当你完成对象时”。如果系统的其他部分仍然需要该对象,他们将保留它。保留你想要的,释放你已经完成的。

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

从静态分析器(Xcode 4 中的 Cmd-Shift-B)开始,看看它是否找到了你的过度释放。但是,它并不能很好地找到 ivar overreleases。然后,确保您始终使用访问器,除了 init 中的访问器。和 dealloc (和 init 是有争议的)。直接访问您的 ivars 是内存管理困惑的第一大原因,也是崩溃的第一大原因。

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

关于objective-c - 基本内存管理 : Calling [super dealloc] in dealloc method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com