【问题标题】:Why does Xcode create a weak reference for an IBOutlet? [duplicate]为什么 Xcode 会为 IBOutlet 创建弱引用? [复制]
【发布时间】:2014-03-06 10:06:24
【问题描述】:

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

为什么将它声明为弱指针?据我了解,当对象被释放时,它的所有成员也会被释放。在我的大部分代码中,我将插座声明为强指针。这会造成问题吗?

【问题讨论】:

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


【解决方案1】:

根据 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;

【讨论】:

    【解决方案2】:

    为了扩展@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 开始已经贬值。这使得其中大部分内容无关紧要,但遵循约定仍然是一种很好的做法。

    【讨论】:

      【解决方案3】:

      您只需要对 UI 的根级对象有一个强引用,低于此的任何内容都可能是弱引用(因为父对象将拥有它们的子对象)。

      我的建议是为了更好地理解。苹果文档。

      Transitioning To ARC

      【讨论】:

        猜你喜欢
        • 2013-06-30
        • 2014-06-17
        • 2012-08-20
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        相关资源
        最近更新 更多