为什么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