Iphone 保留IBOutlet视图元素的最佳实践是什么?

Iphone 保留IBOutlet视图元素的最佳实践是什么?,iphone,Iphone,我经常遇到UIViewController包含大量IBOutlet的情况,这些IBOutlet将控制器连接到其视图的子视图(通常是UILabels) 以下“最佳实践”,即在所有UI元素上使用retain:@property(retain,非原子)UILabel*元素1,@property(retain,非原子)UILabel*元素2。。。在视图控制器的dealloc和viewDidUnload中提供了大量的锅炉板代码 除非在加载nib时自动,否则不会在UIViewController外部使用或设

我经常遇到UIViewController包含大量IBOutlet的情况,这些IBOutlet将控制器连接到其视图的子视图(通常是UILabels)

以下“最佳实践”,即在所有UI元素上使用retain:
@property(retain,非原子)UILabel*元素1
@property(retain,非原子)UILabel*元素2
。。。在视图控制器的
dealloc
viewDidUnload
中提供了大量的锅炉板代码

除非在加载nib时自动,否则不会在UIViewController外部使用或设置有问题的IBOutlet(set方法仅在viewDidUnload和加载nib时使用)

“最佳实践”的结果是:

  • dealloc
    充斥着
    [theElement1发布]
    [theElement2发布]
  • 使用
    [self-setTheElement1:nil]
    [self-setTheElement2:nil]
    等查看卸载
但是,由于已知所有这些元素都会被视图保留,并且UIViewController会在适当的时间释放视图,因此我认为绝对没有任何理由手动管理它

这种特殊的“最佳实践”(据我所知)的原因是与您的需求保持一致。但是,一旦你开始拥有大量的插座,你很可能会错过用这两种方法中的任何一种来处理某个插座,而不是在视图结束后将插座正确地更改为“保留”那些你真正想要保留的特殊插座


除了我所知道的那个“最佳实践”之外,还有其他原因吗?或者在UIViewController视图的子视图的特殊情况下,我是否可以随意打破这个“规则”?

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

在objc2.0之前,我们也必须手工编写所有访问器(@property和@synthesis是该语言的新添加)。事情变得好多了。当我们转向64位ABI和垃圾收集时,事情变得更加简单(你应该期待这些东西最终会进入iPhone)


但现在,请遵循中列出的内存管理规则。你可以用少量的打字来换取大量的调试。(嗯,看起来他们又更新了这个文档;是时候自己研究了。)

我喜欢这个问题的主题。“真的”很好——我以前没有看过Nib内存管理文档。过了一段时间,我唯一明智的选择就是手工生成UI元素并将它们粘贴到NSArray中。但那就像挥舞着旗帜,然后放弃。拥有20-30个左右的iboutlet是维护的噩梦。你可能会问,为什么我会有这么多出口?本地化的UILabels是我的答案。除了使调试涉及这些字段的bug变得更加困难之外,还有什么缺点?事实上,对于这些特定字段,您可以放弃整个@property/@synthesis,并将这些字段设置为@private,以防止任何其他类错误地认为即使在删除视图时也可能使用它们。我是在UIViewController和(只读)该控制器视图的子视图的非常特定的上下文中进行讨论的。大量IBOutlets的问题似乎不太可能出现在其他应用程序中。如果您有20-30个标签,我只会本地化NIB而不是标签。问题不是其他人弄乱了您的插座,而是视图控制器在释放标签后修改插座(以安装正确的标签)。由于内存警告,每次重新加载时都必须重新插入这些标签。如果你不小心的话,你会修改我们的IBOutlet指针,当它被释放时,你会崩溃。当我说“调试困难”时,我的意思是“内存紧张时,现场崩溃,你不知道为什么。”不幸的是,在nib中进行本地化并不总是可能的,也不实际。请详细说明“视图控制器修改插座”的含义。是否指向在viewDidUnload(响应内存限制)和viewDidLoad(恢复控制器和视图)之间访问这些字段?