我的问题是为什么弱 IBOutletCollection 总是为零?如果将弱变强我所有的按钮都在那里,那真的很奇怪。我试图理解苹果的逻辑,我看不出单个按钮和一组按钮在内存管理方面没有区别。我错过了什么吗?
2 回答
绝不是完整的,但简单的答案:
使用 IB 创建的单个UIButton
视图会自动成为其他一些 UIView 的子视图(至少是您的 .view UIViewController
),因此被强烈指向。
AnIBOutletCollection
是NSArray
or NSMutableArray
,不是在UIView
任何地方显示的,并且 UIView 显然没有指向 Outlet(Collection) 的属性指向它们,所以没有任何东西指向 IBOutletcollections。你必须自己做。
来自 Apple 的资源编程指南:
每次您要求 NSBundle 或 NSNib 类加载 nib 文件时,底层代码都会在该文件中创建对象的新副本并将它们返回给您。(nib 加载代码不会从先前的加载尝试中回收 nib 文件对象。)您需要确保在必要时维护新的对象图,并在完成后放弃它。您通常需要对顶级对象的强引用以确保它们不会被释放;您不需要对图中较低的对象进行强引用,因为它们归其父对象所有,并且您应该将创建强引用循环的风险降至最低。
从实际的角度来看,在 iOS 和 OS X 中的 outlet 应该被定义为声明的属性。出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。因此,您创建的 Outlets 通常应该很弱,因为:
例如,您为视图控制器的视图或窗口控制器的窗口的子视图创建的出口是对象之间的任意引用,并不暗示所有权。强插座经常由框架类指定(例如,UIViewController 的视图插座,或 NSWindowController 的窗口插座)。
@property (weak) IBOutlet MyView *viewContainerSubview;
@property (strong) IBOutlet MyOtherClass *topLevelObject;
在页面下方:
当插座应被视为拥有引用的对象时,插座应更改为强:
- 如前所述,文件所有者经常出现这种情况——nib 文件中的顶级对象通常被认为归文件所有者所有。
- 在某些情况下,您可能需要 nib 文件中的对象存在于其原始容器之外。例如,您可能有一个视图的出口,可以暂时从其初始视图层次结构中删除,因此必须独立维护。