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

Nuo*_*oji 5 iphone

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

继"最佳实践",即使用保留的所有UI元素:@property (retain, nonatomic) UILabel *theElement1,@property (retain, nonatomic) UILabel *theElement2,...给我疯了大量的锅炉板代码dealloc,并viewDidUnload在视图控制器.

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

"最佳实践"的结果是:

  • dealloc与散落[theElement1 release],[theElement2 release]等等.
  • viewDidUnload[self setTheElement1:nil],[self setTheElement2:nil]等等.

但是,由于所有这些元素都已被视图保留,并且UIViewController在适当的时候释放了视图,因此我完全没有理由手动管理它.

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

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

Rob*_*ier 4

您应该坚持这种最佳实践。当您在内存警告后访问 IBOutlet 时,它可以保护您免受非常奇怪的崩溃。是的,您需要手动管理 IBOutlet。Accessorizer在自动化此代码方面做得很好。

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

但现在,请遵循Nib 对象的内存管理中规定的内存管理规则。您可以用少量的输入来换取大量的调试。(嗯,看起来他们又更新了这个文档;是时候自己研究一下了。)