4

为 iPhone 应用程序使用 xcode 4.2,没有 ARC ---

当我使用 interface builder 创建一个 outlet 时,xcode 将两行代码添加到我的 viewController。一个在 viewDidUnload: --[self setMyOutlet:nil]和第二个在 dealloc -- [myOutlet release]

我理解后者(发布)。但是为什么在 viewDidUnload 中将 outlet 设置为 nil。viewDidUnload 不会在 dealloc 之前被调用,并且不会将 outlet 设置为 nil 否定 dealloc 中的释放操作吗?设置为 nil 对构建使用垃圾收集的 Mac 应用程序来说是有意义的——但对于 iPhone 应用程序来说没有意义。

为什么界面构建器会这样做?我应该删除将网点设置为零的行吗?

4

2 回答 2

3

viewDidUnload可以调用也可以不调用。这取决于当前的内存使用情况。dealloc是您应该清理所有属性(如数组、自定义对象)的地方。在viewDidUnload您清理视图和可能为支持该视图而创建的对象。viewDidUnload意味着您的视图已卸载(但不是整个视图控制器),并且将来可能会再次创建和加载(当然是在 viewDidLoad 中)。

于 2012-04-16T19:01:08.660 回答
0

viewDidUnload 不是每次都在 dealloc 之前调用,看看苹果文档怎么说..

当内存不足的情况发生并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。此方法在视图控制器的视图被释放后调用,这是您执行任何最终清理的机会。如果您的视图控制器存储了对视图或其子视图的单独引用,您应该使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但在视图消失后不再需要的任何对象的引用。您不应使用此方法发布用户数据或任何其他无法轻松重新创建的信息。

所以它背后的想法是释放任何可以轻松创建的不需要的对象。现在来到将属性设置为 nil 的部分。它这样做是因为这样你会释放所有内存并将对象设置为 nil (从而降低你的内存使用量),然后如果你的应用程序调用了 dealloc不会像在objective-c中那样崩溃,您可以将发布消息发送到nil对象..

我建议你阅读苹果ViewController 编程指南,它会解决你的很多问题......希望这能消除一些空气......:D

于 2012-04-16T19:07:01.760 回答