Objective c 基本内存管理:在dealloc方法中调用[super dealloc]
如果我有一个由视图控制器控制的视图堆栈,并且当我从视图堆栈中弹出视图时调用了视图的dealoc(包含Objective c 基本内存管理:在dealloc方法中调用[super dealloc],objective-c,ios,xcode,memory-management,dealloc,Objective C,Ios,Xcode,Memory Management,Dealloc,如果我有一个由视图控制器控制的视图堆栈,并且当我从视图堆栈中弹出视图时调用了视图的dealoc(包含[super dealoc])方法,这是否意味着我不必释放创建它的视图控制器 我之所以这样问,是因为我最初是在创建视图并将其推送到导航控制器后才释放视图的,但当我包含[viewController release]时,我会不断出现“过度释放”错误。如果没有该语句,导航控制器工作正常,XCode中的analyze函数不会抱怨潜在的内存泄漏 任何形式的解释都将不胜感激 编辑:发生这种情况的示例 On
[super dealoc]
)方法,这是否意味着我不必释放创建它的视图控制器
我之所以这样问,是因为我最初是在创建视图并将其推送到导航控制器后才释放视图的,但当我包含[viewController release]
时,我会不断出现“过度释放”错误。如果没有该语句,导航控制器工作正常,XCode中的analyze函数不会抱怨潜在的内存泄漏
任何形式的解释都将不胜感激
编辑:发生这种情况的示例
OnePlaceViewController *mapView = [[OnePlaceViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:mapView animated:YES];
通常我会在按下导航控制器后调用
[mapView release]
(在我对内存管理的理解中,无论如何),但如果我一直在那里排队,我的应用程序就会崩溃。你从来没有直接调用-dealoc
。唯一接近的是对[super dealloc]
的调用,而这应该只在您自己的dealloc
中调用。如果您直接调用dealloc
,您应该预计稍后会发生崩溃
如果您想说[viewController release]
,则表示保留和释放之间存在不匹配。你应该释放你所保留的。有关详细说明和完整文档的链接,请参阅。它们并不难,但你必须始终如一地遵循它们
编辑如果允许,则应在处理完对象后释放。这并不意味着“什么时候该销毁对象”。这意味着“当你处理完对象时”。如果系统的其他部分仍然需要该对象,他们将保留它。保留你想要的,释放你所做的
在您的示例中,您应该释放地图视图
。你已经把它交给了导航控制器,现在你已经完成了。如果你在发布时崩溃了,你可能在其他地方发布过度了。最可能的位置是OnePlaceViewController
的IVAR之一,或者它所拥有的对象的IVAR之一
从静态分析器(Xcode 4中的Cmd-Shift-B)开始,看看它是否发现了您的过度使用。不过,这并不能很好地发现ivar的过度使用。然后,确保始终使用除init
和dealoc
之外的访问器(并且init
是有争议的)。直接访问IVAR是内存管理混乱的首要原因,也是崩溃的首要原因
不要只是随机插入和删除保留和释放。你会把自己捆成结的。如果你修好了撞车,你会泄漏的。当你修补漏洞时,你会崩溃的。你必须找到错误并改正它。在升级到包含ARC的系统之前,没有任何解决方法(此时所有这些都会神奇地消失)首先,您应该阅读苹果公司的《内存管理编程指南》
其次,您不应该直接调用[anObject dealloc]。例外情况是dealoc方法中的[super dealoc]。您将使用release和autorelease
同样,遵守苹果公司的内存管理规则,你会很好的以下几点:
1) 将视图控制器推到导航控制器或任何其他“容器”视图控制器上后,应始终释放
,因为这些控制器将保留在您刚刚alloc
ed的视图控制器上。例外情况是,如果您希望将视图控制器存储在ivar中以备以后使用,在这种情况下,您应该保留保留。在这种情况下,您可能会得到过度释放的崩溃,因为OnePlaceViewController
的dealloc
方法中的某些内容被过度释放。对于尚未保留的对象,请检查该方法
2) 使用“视图”和“视图控制器”时要小心。视图是图形空间的抽象,视图控制器是包含管理视图逻辑的对象。如果您正在使用IB并通过nib(看起来是这样)分配视图控制器,那么该视图控制器的所有视图内存管理都应该自动处理。除了OnePlaceViewController
中的视图之外,我会仔细查看您正在使用的任何对象,以查看是否有任何对象被释放了两次。很好,我的意思是[viewController release]
。我有一个控制台日志语句,它在每个dealloc方法的开头被调用,因此我可以看到何时调用每个方法。如果我alloc
一个对象,即使在某个时候调用了它的dealloc方法,我仍然需要释放它吗?或者当我释放它时是否调用了它的dealloc方法?dealloc
在对象的保留计数达到0时调用。每当您release
对象或在自动释放池排空时发生autorelease
时,保留计数将减少1。因此,一般来说,你应该总是在保留
或分配
与发布
“始终平衡保留或分配”或复制
或新的
”与发布
“我知道。请参见上面的编辑。我的意思是说[viewController release]
。您在哪里保留视图控制器?有些代码片段在这里很有用。[mapView release]在将其推送到navigationController后就可以了。你应该这么做。如果以后应用程序崩溃,很可能是因为你再次发布了vc。看看navigationController的生命周期,谁在保留navigationController?您还应该检查该对象的生命周期。那么您是说问题可能是OnePlaceViewController中的某些内容可能被夸大了?我还应该说,在这篇文章中