为什么Xcode会为IBOutlet创建弱引用?

时间:2014-02-09 01:36:32

标签: ios objective-c automatic-ref-counting iboutlet

我注意到当我在故事板中创建一个插座时,它会生成以下代码__weak IBOutlet UILabel *mLabel;

为什么将它声明为弱指针?根据我的理解,当对象被释放时,其所有成员也将被释放。在我的大部分代码中,我都宣称这些出口是强有力的指针。这会产生问题吗?

3 个答案:

答案 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)

你只需要对UI的根级对象有一个强引用,这下面的任何东西都可能很弱(因为父对象将拥有他们的孩子)。

我建议更好地理解。 Apple Docs。

Transitioning To ARC