Interface Builder将控制插座设置为零 - 为什么?

时间:2012-04-16 18:36:54

标签: objective-c ios xcode

使用xcode 4.2 for iPhone app,不使用ARC ---

当我使用界面构建器创建插座时,xcode会在我的viewController中添加两行代码。一个在viewDidUnload中: - [self setMyOutlet:nil],第二个在dealloc - [myOutlet release]

我理解后者(发布)。但是为什么在viewDidUnload中将插座设置为nil。是不是在dealloc之前调用viewDidUnload并且不会将出口设置为nil否定dealloc中的释放操作?设置为nil有意义我会考虑构建一个使用垃圾收集的Mac应用程序 - 但它对于iPhone应用程序没有意义。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

  

当出现内存不足的情况和当前视图控制器时   如果不需要视图,系统可能会选择从中删除这些视图   记忆。在视图控制器的视图之后调用此方法   已经发布,你有机会进行任何最后的清理工作。如果你的   视图控制器存储对视图或其视图的单独引用   子视图,您应该使用此方法来释放这些引用。您   也可以使用此方法删除对您的任何对象的引用   创建以支持视图但现在不再需要了   观点消失了。您不应该使用此方法来释放用户数据或   任何其他无法轻易重建的信息。

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

我建议你阅读苹果ViewController Programming Guide,它会清除你的很多问题....希望这能清除一些空气......:D