2012-04-16 62 views
4

使用xcode 4.2 for iPhone应用程序,无ARC ---Interface Builder将控制点设置为零 - 为什么?

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

我明白后者(发布)。但为什么在viewDidUnload中将插座设置为零。在dealloc之前不会调用viewDidUnload,并且不会将deutoc中的outlet设置为否定否定释放操作?设置为零是有道理的,我认为构建一个使用垃圾回收的Mac应用程序 - 但它对iPhone应用程序没有意义。

为什么界面生成器会这样做?我应该删除设置网点的线路为零吗?

+0

我不知道你是否正确,但如何在这个函数中设置一个断点来解决它? – Seega 2012-04-16 18:58:01

+0

[为什么在viewDidUnload中为IBOutlet分配nil?](http://stackoverflow.com/questions/7318599/why-assign-nil-to-iboutlets-in-viewdidunload) – 2012-04-16 19:07:35

回答

3

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

+0

谢谢。这现在是有道理的。我所缺少的是由@synthesize创建的setter将在将指针设置为nil之前释放该对象。我想知道为什么我没有在分析器中看到内存链接。谢谢你的回答! – lp1756 2012-04-16 19:33:08

0

viewDidUnload是不是一个dealloc的前称为每次,看到苹果的文档说什么..

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

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

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

相关问题