我已经阅读了几个问答和文档,其中指出我们应该为 IBOutlet 使用弱,除非它是来自文件所有者的顶级对象。
但是如果我仍然使用强/保留,是否有任何重大缺点,或者它只是多余的,因为子视图已经被 addSubview: 保留了?
注意:请不要在这里复制弱/强的定义,我不需要,我想看看现实世界中使用强用于 IBOutlet 可能会导致问题的案例。谢谢。
我已经阅读了几个问答和文档,其中指出我们应该为 IBOutlet 使用弱,除非它是来自文件所有者的顶级对象。
但是如果我仍然使用强/保留,是否有任何重大缺点,或者它只是多余的,因为子视图已经被 addSubview: 保留了?
注意:请不要在这里复制弱/强的定义,我不需要,我想看看现实世界中使用强用于 IBOutlet 可能会导致问题的案例。谢谢。
使用 MRC,如果使用retain
,则必须自己释放内存。
使用 ARC,如果您使用strong
并且系统从您的应用程序请求内存(= 您的视图将被卸载),您将不得不自己释放内存(请注意,控制器仍将处于活动状态,因此不会dealloc
在那里调用)
对于大多数网点来说,weak
/assign
是合适的,因为您不需要关心释放内存。
例外:
IBOutletCollection
必须坚强/保持。NSArray
视图层次结构不保留集合 ( )。
您可以动态添加/删除视图。如果您想从视图层次结构中删除视图并稍后再次使用它,则必须将视图保留在某处,否则在删除时它会被释放。但是,请注意,您始终可以在删除时将其保留在代码中。
在有人提供更好的答案之前,我会将其标记为“已接受”。
显然,唯一的缺点是当您的视图收到内存警告时,它会卸载视图,并且最好释放所有子视图。但是,如果你使用 strong,你的控制器仍然会保留它们,你必须在 viewDidUnload 中手动将它们清零。
从 iOS 6 开始,在收到内存警告时不会卸载视图,因此这变得无关紧要。从实际的角度来看,对 IBOutlet afaik 使用弱或强没有重大区别,除非您必须在应用程序中手动卸载视图。