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

Ios IBOutlet使用强/保留的缺点?,ios,interface-builder,automatic-ref-counting,iboutlet,Ios,Interface Builder,Automatic Ref Counting,Iboutlet,我已经阅读了一些问答和文档,其中指出我们应该为IBOutlet使用弱对象,除非它是来自文件所有者的顶级对象 但是如果我仍然使用strong/retained,是否有任何主要的缺点,或者只是因为addSubview已经保留了子视图而多余 注意:请不要在这里复制弱/强的定义,我不需要它,我希望看到在现实世界中,将强用于IBOutlet可能会导致问题。谢谢。在有人提供更好的答案之前,我会将此标记为“已接受” 显然,唯一的缺点是当您的视图收到内存警告时,它会卸载视图,最好是释放所有子视图。但由于如果使用

我已经阅读了一些问答和文档,其中指出我们应该为IBOutlet使用弱对象,除非它是来自文件所有者的顶级对象

但是如果我仍然使用strong/retained,是否有任何主要的缺点,或者只是因为addSubview已经保留了子视图而多余

注意:请不要在这里复制弱/强的定义,我不需要它,我希望看到在现实世界中,将强用于IBOutlet可能会导致问题。谢谢。

在有人提供更好的答案之前,我会将此标记为“已接受”

显然,唯一的缺点是当您的视图收到内存警告时,它会卸载视图,最好是释放所有子视图。但由于如果使用strong,控制器仍然保留它们,因此必须在viewDidUnload中手动将它们置零


在iOS 6中,在收到内存警告时不会卸载视图,因此这变得无关紧要。从实用的角度来看,除非您必须在应用程序中手动卸载视图,否则在IBOutlet afaik中使用弱视图和强视图之间没有重大区别。

对于MRC,如果您使用
retain
,您必须自己释放内存

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

对于大多数插座,
/
分配
是合适的,因为您不需要关心释放内存

例外情况:

  • IBOutletCollection
    必须是strong/retain。视图层次结构不保留集合(
    NSArray

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


  • 事实并非如此。在iOS 6中,当收到内存警告时,您仍应设置“self.view=nil”。这与苹果公司的说法不同。同样,在iOS 6中,您的视图不会在内存警告下卸载。@EnzoTran True,不是自动的,但如果系统请求内存,您应该释放一些内容。视图层次结构是最简单的发布方式。如果你只有赋值/弱属性,你可以设置“self.view=nil”。苹果公司已经明确表示,卸载视图对内存管理没有太大影响,这正是他们从iOS 6中删除此功能的原因。因此,除非您有一个非常大和复杂的视图,否则您不应该为self.view=nil而烦恼。如果你的应用程序使用了太多内存,很可能是来自应用程序的其他部分。