为什么Xcode为IBOutlet创build一个弱引用?

我注意到,当我在故事板内创build一个sockets,它会生成以下代码__weak IBOutlet UILabel *mLabel;

为什么它宣称它是一个弱指针? 据我了解,当对象被释放时,其所有成员也将被释放。 在我的大部分代码中,我宣称这些网点是强大的指针。 这会造成问题吗?

根据iOS开发者库: 链接在这里

部分: Managing the Lifetimes of Objects from Nib Files

从实际的angular度来看,iOS和OS X应该将networking定义为已声明的属性。 除了从文件所有者到nib文件中的顶层对象(或者在iOS中,故事板场景),这些应该是强大的。 因此,您创build的sockets通常应该较弱,因为:

例如,您为视图控制器视图或窗口控制器窗口的子视图创build的出口是在不隐含所有权的对象之间的任意引用。

强大的出口通常由框架类(例如,UIViewController的视图出口或NSWindowController的窗口)指定。

@property (weak) IBOutlet MyView *viewContainerSubview;

@property (strong) IBOutlet MyOtherClass *topLevelObject;

为了扩展@ 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; 

任何读这个远的人都会注意到-viewDidUnload从iOS 6.0开始折旧。 这使得许多不相关的东西,但遵守公约是一个很好的做法。

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

我build议更好的了解。 苹果文件。

过渡到ARC