【发布时间】:2014-03-06 10:06:24
【问题描述】:
我注意到当我在故事板中创建一个出口时,它会生成以下代码__weak IBOutlet UILabel *mLabel;。
为什么将它声明为弱指针?据我了解,当对象被释放时,它的所有成员也会被释放。在我的大部分代码中,我将插座声明为强指针。这会造成问题吗?
【问题讨论】:
标签: ios objective-c automatic-ref-counting iboutlet
我注意到当我在故事板中创建一个出口时,它会生成以下代码__weak IBOutlet UILabel *mLabel;。
为什么将它声明为弱指针?据我了解,当对象被释放时,它的所有成员也会被释放。在我的大部分代码中,我将插座声明为强指针。这会造成问题吗?
【问题讨论】:
标签: ios objective-c automatic-ref-counting iboutlet
根据 iOS 开发者库:link here
部分:Managing the Lifetimes of Objects from Nib Files
从实用的角度来看,在 iOS 和 OS X 插座中应该 定义为声明的属性。插座一般应该是弱的, 除了从文件所有者到 nib 文件中的顶级对象的那些 (或者,在 iOS 中,故事板场景)应该很强大。网点 因此,您创建的通常应该很弱,因为:
您为视图控制器的视图或视图的子视图创建的 Outlets 例如,窗口控制器的窗口是任意引用 在不暗示所有权的对象之间。
强大的出口是 经常由框架类指定(例如, 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 开始已经贬值。这使得其中大部分内容无关紧要,但遵循约定仍然是一种很好的做法。
【讨论】:
【讨论】: