在 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。那么你将无法使用releasedealloc等,因为系统会处理内存管理。

要了解有关 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 对象?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 5 AVPlayerItem 的一个实例被释放

在自动释放 ios 项目中保留变量

UIViewControl之间的七种传值方式

内存累积,View Controller 之间切换,怎么回事?

iOS3、iOS4、xibbed UIViewController 及显示数据

iPhone/iOS:如何为 Scrollview 的子视图实现拖放?