我的问题是为什么弱IBOutletCollection总是为零?如果改变弱到强,我的所有按钮都在那里,这真的很奇怪。我试图理解苹果的逻辑,我可以看到单个按钮和一系列按钮在内存管理方面没有区别。我错过了什么吗?
答案 0 :(得分:9)
绝不是完整的,而是简单的回答:
使用IB创建的单个UIButton
自动成为其他一些UIView的子视图(至少是UIViewController
的.view),并因此而强烈指出。
IBOutletCollection
是NSArray
或NSMutableArray
,而不是UIView
显示在任何地方,UIViews显然没有指向指向他们的Outlet(Collection)的属性,所以没有任何东西指向IBOutletcollections。你必须自己做。
答案 1 :(得分:7)
来自Apple的Resource Programming Guide:
每次要求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;
在页面的下方:
当出口应被视为拥有引用对象时,应将插座更改为强:
- 如前所述,通常情况下,文件的所有者 - nib文件中的顶级对象通常被视为归文件所有者所有。
- 在某些情况下,您可能需要来自nib文件的对象存在于其原始容器之外。例如,您可能有一个可以暂时从其初始视图层次结构中删除的视图的插座,因此必须单独维护。