【问题标题】:IBOutlet should be weak? [duplicate]IBOutlet 应该弱吧? [复制]
【发布时间】:2012-08-20 14:16:45
【问题描述】:

可能重复:
Should IBOutlets be strong or weak under ARC?

我简要地阅读了 ARC 并认为可以,一切都很强大,而代表很弱。

现在我正在界面构建器中创建一个视图并制作 IBOutlets,并且 Xcode 的默认设置设置为弱。

这个建议似乎是有原因的,大多数 IBOutlets 想要弱属性是否有原因?

是因为这些视图(IBOutlets)已经被保留,因为它们附加到它的超级视图?而且我们很少替换 IBOutlet 视图?

但我认为将其设置为强没有什么坏处,有问题吗?

【问题讨论】:

  • 只要确保你使用strong,在viewDidUnload中添加self.myOutlet = nil;
  • Mazyod:有必要吗?当self的retain count为零时,它的所有子视图都不会被释放?

标签: iphone ios automatic-ref-counting iboutlet


【解决方案1】:

这只是偏好。 weak 或 assign 的基本原理是,superviews、controllers 等将在该图中的对象生命周期内持有强引用。

就我个人而言,我是老派,并且喜欢强有力的参考——即使在这种情况下也是如此。有时,使用强引用意味着您可能需要显式破坏对象子图的组件(例如,在拆除时必须“打破”所有循环依赖关系)。我只在非常特殊的情况下使用弱,因为我喜欢一致性;当/如果出现问题以及阅读程序时,变量会更少。

【讨论】:

    【解决方案2】:

    有关为什么IBOutlet 引用应该是弱的讨论,请参阅Resource Programming Guide: Nib Files。我从指南中引用:

    出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。因此,您创建的 Outlets 通常应该是弱的,因为:

    • 例如,您为视图控制器的视图或窗口控制器的窗口的子视图创建的 Outlets 是对象之间的任意引用,并不暗示所有权。
    • 强插座通常由框架类指定(例如,UIViewController 的视图插座或NSWindowController 的窗口插座)。

    对于我自己的两分钱,如果我拥有它,我会制作 strong,或者我需要一个强有力的参考,以防所有者离开并且我需要保留它,这两种情况都不适用。所以,与其问“为什么我不能做到strong?”,我会问“我为什么要做到strong?”如果没有充分的理由这样做,我会让 Interface Builder 做它的事情并使它成为 weak

    【讨论】:

    • 我的两分钱同意。我还要补充一点,找到 weak 应该是 strong 的情况(“嘿,我没想到那是零......我想我需要一个强有力的参考”)比反过来(启动 Instruments 并查找泄漏)。
    • @Rob:视图不拥有它的子视图吗?或视图控制器拥有它的视图?我没有得到“例如,您为视图控制器的视图或窗口控制器的窗口的子视图创建的插座是不暗示所有权的对象之间的任意引用。”
    • @Eugene 是的,视图控制器拥有它的视图(因此“框架类经常指定强大的出口,例如UIViewController 的视图出口”),并且视图拥有它的子视图。但是视图控制器拥有它的视图的子视图;正如您刚刚指出的那样,视图确实如此。
    猜你喜欢
    • 2015-06-07
    • 2014-03-06
    • 2012-06-25
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多