Interface Builder 将控制出口设置为零——为啥?

Posted

技术标签:

【中文标题】Interface Builder 将控制出口设置为零——为啥?【英文标题】:Interface Builder sets control outlets to nil -- why?Interface Builder 将控制出口设置为零——为什么? 【发布时间】:2012-04-16 18:36:54 【问题描述】:

为 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 应用程序没有意义。

为什么界面生成器会这样做?我应该删除将 outlet 设置为 nil 的行吗?

【问题讨论】:

我不知道你说的对不对,但是在那个函数中设置一个断点来解决这个问题怎么样? Why assign nil to IBOutlets in viewDidUnload? 的可能重复项 【参考方案1】:

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

为什么为零 - Objective-C Difference between setting nil and releasing Understanding How Views Are Loaded and Unloaded

【讨论】:

谢谢。现在这是有道理的。我缺少的是@synthesize 创建的setter 将在将指针设置为nil 之前释放对象。我想知道为什么我没有在分析器中看到内存链接。谢谢你的回答!【参考方案2】:

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

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

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

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

【讨论】:

以上是关于Interface Builder 将控制出口设置为零——为啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UICollectionViewCell 在 Interface Builder Xcode7.1 OS X Yosemite 中的出口为零?

如何使用 Interface Builder 设置 UIScreenEdgePanGestureRecognizer?

Xcode 6 Interface Builder 视图大小错误

丰富的、类似窗口的上下文菜单(如 Interface Builder)

在 Interface Builder 中设置 Nib Name 字段时出现异常

IOS Interface Builder - 在单个视图控制器场景中管理多个视图