弱IBOutleCollection总是零

dar*_*iaa 10 memory-management interface-builder storyboard ios automatic-ref-counting

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

blu*_*lub 9

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

UIButton用IB创建的单个自动是其他一些UIView的子视图(至少是你的.view UIViewController)并且因此而强烈指向.

An IBOutletCollection是一个NSArrayor NSMutableArray,而不是在UIView任何地方显示,UIViews显然没有指向Outlet(Collection)的属性指向它们,所以没有任何东西指向IBOutletcollections.你必须自己做.


mbu*_*c91 7

来自Apple的资源编程指南:

每次请求NSBundle或NSNib类加载nib文件时,底层代码都会在该文件中创建对象的新副本并将它们返回给您.(nib加载代码不会从先前的加载尝试中回收nib文件对象.)您需要确保在必要时维护新的对象图,并在完成它时将其取消.您通常需要对顶级对象的强引用,以确保它们不会被释放; 您不需要对图表中较低的对象进行强引用,因为它们由父母拥有,您应该尽量减少创建强引用周期的风险.

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

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

@property (weak) IBOutlet MyView *viewContainerSubview;
@property (strong) IBOutlet MyOtherClass *topLevelObject;
Run Code Online (Sandbox Code Playgroud)

在页面下方:

当插座应被视为拥有引用对象时,应将插座更改为强:

  • 如前所述,通常情况下,文件的所有者 - nib文件中的顶级对象通常被视为归文件所有者所有.
  • 在某些情况下,您可能需要来自nib文件的对象存在于其原始容器之外.例如,您可能有一个可以暂时从其初始视图层次结构中删除的视图的插座,因此必须单独维护.