在 iOS 5 中释放 UIviewController 对象?
Posted
技术标签:
【中文标题】在 iOS 5 中释放 UIviewController 对象?【英文标题】:Releasing UIviewController object in iOS 5? 【发布时间】:2012-03-14 11:33:52 【问题描述】:我想在 ios 5 中发布 UIViewController 对象。 之前的 iOS 版本 (>5.0) 我们总是编写代码或维护代码,随后会出现无内存泄漏,
if(myViewControllerObject != nil)
[myViewControllerObject.view removeFromSuperView];
[myViewControllerObject release];
myViewControllerObject = nil;
myViewControllerObject = [[MyViewControllerObject alloc] initWithNibName:@"MyViewControllerObject" bundle:nil];
[self.view addSubview: myViewControllerObject.view];
但是在 iOS 5 中我们不能使用 release 方法来释放 UIviewController 对象,那么在 iOS 5 中我们必须做些什么来维护额外的对象分配和泄漏? 实现这种层次结构的最佳方法是什么?
谢谢。
【问题讨论】:
【参考方案1】:除非您为项目启用自动引用计数,否则您的代码不会更改为 iOS 5。那么你将无法使用release
、dealloc
等,因为系统会处理内存管理。
要了解有关 ARC 的更多信息,请参阅此问题:How does the new automatic reference counting mechanism work?
【讨论】:
如果我们不释放对象,这不是一个崩溃的机会吗? 不,不释放对象可能会导致不必要的内存消耗和内存泄漏。但正如我所说,使用 ARC 可以防止这种情况发生——发布是自动完成的(或多或少),这样您就不必自己编写release
语句。【参考方案2】:
如果您使用的是 ARC(自动保留/引用计数),那么您根本不需要使用 release
。编译器现在计算所有保留并自动释放它们。它不是真正的垃圾回收,但编译器只是找出不再使用对象的位置并自动添加释放。
所以在回答你的问题时,留下它,编译器会解决它。
【讨论】:
感谢 Thomas 为我提供简短的解释....nw 我理解你的回答也可以接受 :) 但要强制 arc 释放它,请使用myViewControllerObject = nil;
。
如果我们不释放对象是不是就有崩溃的机会?
@VineeshTP 如果您使用的是 ARC,那么编译器将自动为您添加发布和保留调用。所以,不,您的应用不会崩溃。
我不知道你的全部情况和细节。但如果你说的是对的,那么你的项目负责人就错了。 ARC 将自动为所有目标 c 对象(NSObject 子类)添加保留和释放调用。您可以分配给 nil (self.object = nil;
) 以强制 ARC 释放,但这不是必需的,您的应用程序不会崩溃。仍有一些方法可以让您的应用从 EXC_BAD_ACCESS
(过早发布)中崩溃,但这些都是极端情况,您可能做错了什么。【参考方案3】:
你不应该打电话
[myViewControllerObject.view removeFromSuperView];
UIViewController 类(myViewControllerObject 的基类)可以在内存不足以及最终释放视图控制器时自动将此属性设置为 nil。
这样应该没问题
[myViewControllerObject release];
myViewControllerObject = nil;
更新:对于 ARC,请参阅下面的答案
【讨论】:
以上是关于在 iOS 5 中释放 UIviewController 对象?的主要内容,如果未能解决你的问题,请参考以下文章
内存累积,View Controller 之间切换,怎么回事?