我注意到当我在故事板中创建一个插座时,它会生成以下代码__weak IBOutlet UILabel *mLabel;
。
为什么将它声明为弱指针?根据我的理解,当对象被释放时,其所有成员也将被释放。在我的大部分代码中,我都宣称这些出口是强有力的指针。这会产生问题吗?
答案 0 :(得分:5)
为了扩展@ Joel的答案,这不是ARC和手动引用计数(MRC)之间的变化。在具有NIB的MRC代码中,只有根级视图声明为:
@property (nonatomic, retain) IBOutlet UIView *view;
self.view
的所有子视图都应声明为:
@property (nonatomic, assign) IBOutlet UIView *aSubView;
当它转换为ARC时,它应该是这样的:
@property (nonatomic, strong) IBOutlet UIView *view;
@property (nonatomic, weak) IBOutlet UIView *aSubView;
原因是为了节省-viewDidUnload
方法中的工作(和复杂性)。释放根级视图后,将自动释放所有子视图。如果您是强引用,则除非-viewDidUnload
明确包含以下内容,否则不会取消分配子视图:
self.aSubView = nil;
任何阅读此内容的人都会注意到,自{i} 6.0起,-viewDidUnload
已弃用。这使得大部分内容无关紧要,但遵循惯例仍然是一种很好的做法。
答案 1 :(得分:5)
根据iOS开发人员库:link here
部分: Managing the Lifetimes of Objects from Nib Files
从实际角度来看,iOS和OS X应该是 定义为声明的属性。奥特莱斯一般应该很弱, 除了从文件所有者到nib文件中的顶级对象的那些 (或者,在iOS中,故事板场景)应该是强大的。那个奥特莱斯 因此,你创造的应该通常很弱,因为:
您为视图控制器的视图或a的子视图创建的插座 例如,窗口控制器的窗口是任意引用 在不暗示所有权的对象之间。
强大的渠道是 经常由框架类指定(例如, UIViewController的视图出口,或NSWindowController的窗口 出口)。
@property (weak) IBOutlet MyView *viewContainerSubview;
@property (strong) IBOutlet MyOtherClass *topLevelObject;
答案 2 :(得分:1)