使用强力/保留IBOutlet的缺点?

时间:2013-06-12 12:14:22

标签: ios interface-builder automatic-ref-counting iboutlet

我已经阅读了几个Q& A和文档,其中声明我们应该对IBOutlet使用weak,除非它是来自文件所有者的顶级对象。

但是如果我仍然使用强/保留,是否有任何重大缺点,或者它是多余的,因为子视图已经保留了addSubview:?

注意:请不要在这里复制弱/强的定义,我不需要那样,我想看看真实世界中使用IBOutlet强可能导致问题的情况。感谢。

2 个答案:

答案 0 :(得分:1)

使用MRC,如果您使用retain,则必须自行释放内存。

使用ARC,如果您使用strong并且系统从您的应用程序请求内存(=您的视图将被卸载),您将必须自己释放内存(请注意,控制器仍将处于活动状态,所以没有dealloc在那里召唤)

对于大多数商店而言,weak / assign是合适的,因为您不需要关心释放内存。

例外:

  1. IBOutletCollection必须坚强/保留。视图层次结构不保留集合(NSArray)。

  2. 您可以动态添加/删除视图。如果要从视图层次结构中删除视图并在以后再次使用它,则必须在某处保留视图,否则在删除时将其取消分配。但请注意,您可以在删除时始终将其保留在代码中。

答案 1 :(得分:0)

我会将此标记为“已接受”,直到有人提供更好的答案。

显然唯一的缺点是,当您的视图收到内存警告时,它会卸载视图,并且最佳应释放所有子视图。但是,如果你使用strong,你的控制器仍会保留它们,你必须在viewDidUnload中手动将它们取出。

从iOS 6开始,视图在收到内存警告时未被卸载,因此这无关紧要。从实际的角度来看,对于IBOutlet afaik使用weak或strong之间没有什么重大区别,除非您必须在应用程序中手动卸载视图。