Iphone 开发 - ViewDidUnload

Posted

技术标签:

【中文标题】Iphone 开发 - ViewDidUnload【英文标题】:Iphone dev - ViewDidUnload 【发布时间】:2012-03-04 23:37:16 【问题描述】:

我正在使用 ARC

在我正在看的一些教程中,他曾经制作了一个 UILabel,然后在 ViewDidUnload 方法中他写道: self.theLabelVariable = nil; 从那以后,我再也没有看到他在 ViewDidUnload 中写过任何东西......但是。

我对该方法应该使用什么代码有点困惑。

1。 我应该在什么时候写什么? 有评论说: “释放主视图的所有保留子视图。例如 self.myOutlet = nil;” 虽然不太清楚这是什么意思

2。 它还有一个“[super ViewDidUnload]”是做什么的?

3。 有人说“当你不打算再次使用它时将它设置为零是个好主意”。 但是在有人写“self.TheLabelVariable = nil”的教程中,当我点击主页按钮然后再次打开应用程序时,一切正常。 或者当你点击主页按钮时它不是 cViewDidUnload 吗? 我想第三个问题是:什么时候调用?

【问题讨论】:

【参考方案1】:

您应该对所有IBOutlets 执行此操作。您应该将它们全部设置为nil。而[super viewDidUnload]; 正在卸载超级视图!有点像[super viewDidLoad];

【讨论】:

【参考方案2】:

1 - 您应该使用 viewDidUnload 来释放(如果它是一个属性,则设置为 nil)任何在卸载视图时不需要的对象,例如视图,并且您将在 viewDidLoad 上重新创建。示例:卸载视图时不需要标签(通过按下主页按钮),然后释放它,然后在视图加载时再次创建它(应用程序出现)。

2 - [super something] 调用超类的方法。例如,如果您有一个作为 UIViewController 后代的类,调用 [super viewDidUnload] 将执行 Apple 的 UIViewController viewDidUnload 代码(可能为空……也可能不是)。

3 - 参见 1 中的示例。但问题是:当您不再需要某个对象时,将其设置为 nil,这样它就可以被释放并且您不会浪费内存。

如果我遗漏了什么或者有什么你不明白的,请告诉我。

编辑

对于从名为 IBOutlets 的 XIB 文件(界面构建器)初始化的视图,您不需要执行 self.label=nil;因为 UIViewController 为你做。就像它为你初始化它一样,它也会释放它。

【讨论】:

很好的答案,再问一两个问题... 1. 这是否意味着如果我把 self.label = nil;在 ViewDidUnload 中,我是否必须在 ViewDidLoad 中执行 self.label = 某事?但是在他放置self.label = nil;的代码中,他并没有在ViewDidLoad中写任何东西,但是在按下home键然后再次调出之后label仍然是Said 'blue'。并且应用程序仍然有效(按按钮 -> 更改标签文本) 如果有什么不同的话,我会使用故事板。所以如果我去我的故事板,拖入一个 拖入标签或UITextField,在viewcontroller.h中对其做属性,在viewcontroller.h中合成我不需要self.variable = nil? 1.什么时候“从XIB”初始化?您的第一个答案让我觉得 ViewDidUnload 中的每个按钮、标签等都应该设置为 nil,而您的最后一个答案(编辑)听起来好像什么都不应该设置为 nil,因为它会自动执行此操作 基本感觉是,如果一个类不初始化(alloc)一个变量不释放它,搜索所有权规则。 这不是一切,你可以在不使用 IB 的情况下制作整个应用程序,在这种情况下你必须自己管理你的对象。

以上是关于Iphone 开发 - ViewDidUnload的主要内容,如果未能解决你的问题,请参考以下文章

ios6 中不再调用 viewDidUnload

viewdidunload 根本没有被调用

在 viewDidUnload 中我到底必须做啥?

拆除 UIViewController 时是不是总是调用 viewDidUnload 和 dealloc?

iOS6 viewDidUnload 已弃用

从项目的视图控制器中删除所有 -viewDidUnload 的方法