【问题标题】:weak IBOutleCollection is always nil弱 IBOutleCollection 始终为零
【发布时间】:2013-02-10 22:49:35
【问题描述】:

我的问题是为什么弱 IBOutletCollection 总是为零?如果将弱变强我所有的按钮都在那里,那真的很奇怪。我试图理解苹果的逻辑,我看不出单个按钮和一组按钮在内存管理方面没有区别。我错过了什么吗?

【问题讨论】:

  • 感谢您将您的问题表述为“弱”的问题。立即解决了我的问题!

标签: ios memory-management interface-builder storyboard automatic-ref-counting


【解决方案1】:

来自苹果的Resource Programming Guide

每次您要求 NSBundle 或 NSNib 类加载一个 nib 文件时,底层代码都会为该文件中的对象创建一个新副本并将其返回给您。 (nib 加载代码不会从先前的加载尝试中回收 nib 文件对象。)您需要确保尽可能长时间地维护新的对象图,并在完成后放弃它。您通常需要对顶级对象的强引用以确保它们不会被释放;您不需要对图中下方的对象进行强引用,因为它们归其父对象所有,您应该尽量减少创建强引用循环的风险。

从实际的角度来看,在 iOS 和 OS X 中的 outlet 应该被定义为声明的属性。出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。因此,您创建的 Outlets 通常应该是弱的,因为:

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

@property (weak) IBOutlet MyView *viewContainerSubview;
@property (strong) IBOutlet MyOtherClass *topLevelObject;

在页面下方:

当 outlet 应该被认为拥有引用的对象时,应该将 Outlets 更改为 strong:

  • 如前所述,文件所有者经常出现这种情况 - nib 文件中的顶级对象通常被认为归文件所有者所有。
  • 在某些情况下,您可能需要 nib 文件中的对象存在于其原始容器之外。例如,您可能有一个视图的出口,可以暂时从其初始视图层次结构中移除,因此必须独立维护。

【讨论】:

    【解决方案2】:

    绝不是完整的,而是简单的答案:

    使用 IB 创建的单个 UIButton 自动成为其他一些 UIView 的子视图(至少是您的 UIViewController 的 .view),因此被强烈指向。

    IBOutletCollectionNSArrayNSMutableArray,而不是在任何地方显示的UIView,并且 UIView 显然没有指向 Outlet(Collection) 的属性指向它们,所以没有任何东西指向 IBOutletcollections。你必须自己做。

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 2016-05-02
      • 2012-01-16
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多