保留IBOutlet视图元素真的是最佳做法吗?

时间:2010-06-24 17:41:06

标签: iphone

我一直在遇到包含大量IBOutlets的UIViewControllers的情况,这些IBOutlets将控制器连接到其视图的子视图(通常是UILabels)。

遵循“最佳做法”,即在所有用户界面元素上使用保留:​​@property (retain, nonatomic) UILabel *theElement1@property (retain, nonatomic) UILabel *theElement2,...在dealloc和{{1}中为我提供了大量的样板代码视图控制器。

违规IBOutlets永远不会被使用,也不会在UIViewController之外设置(set-method仅用于viewDidUnload和加载nib时),除非在加载nib时自动执行。

“最佳实践”的结果是:

  • viewDidUnload散布着dealloc[theElement1 release]
  • [theElement2 release]viewDidUnload[self setTheElement1:nil]等。

但是,由于所有这些元素都已被视图保留,并且UIViewController在适当的时候释放了视图,我看到 绝对没有任何理由 让我手动管理这个。

这种特殊的“最佳实践”(据我所知)的原因是与您的保留一致。但是,一旦你开始拥有大量的网点,你就更有可能错过在两种方法中的任何一种方式处理某个插座,而不是你无法正确地改变网点以“保留”你真正想要的那些特殊插座即使在观点再见之后也要保留。

这个“最佳实践”除了我所知道的之外还有什么理由,或者在UIViewController视图的子视图的特定情况下我是否可以自由地打破这个“规则”?

1 个答案:

答案 0 :(得分:4)

你应该坚持这个最佳实践。当您在内存警告后访问IBOutlets时,它可以保护您免受非常奇怪的崩溃。是的,您需要手动管理您的IBOutlets。 Accessorizer可以自动执行此代码。

在ObjC 2.0之前,我们必须手动编写所有的访问器(@property和@synthesize是该语言的新增功能)。事情变得更好了。当我们转向64位ABI和垃圾收集时,事情变得更加简单(你应该期望这些东西最终能够进入iPhone)。

但是现在,请遵循Memory Management of Nib Objects中列出的内存管理规则。您需要进行非常少量的输入以进行大量调试。 (嗯,看起来他们已经再次更新了这个文档;是时候自己学习了。)