在ARC(自动引用计数)下,IBOutlets 应该是强引用(strong)还是弱引用(weak)?

发布时间 2023-11-15 12:56:55作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=在ARC(自动引用计数)下,IBOutlets 应该是强引用(strong)还是弱引用(weak)?

我正在使用 ARC(自动引用计数)专门为 iOS 5 进行开发。在这种情况下,指向 UIView(及其子类)的 IBOutlet 应该是 strong 还是 weak

以下是示例:

@property (nonatomic, weak) IBOutlet UIButton *button;

这将消除以下代码:

- (void)viewDidUnload
{
    // ...
    self.button = nil;
    // ...
}

这样做会有什么问题吗?模板和直接从“Interface Builder”编辑器连接到头文件时自动生成的属性都使用了 strong,但为什么?UIViewController 已经对其 view 拥有一个 strong 引用,它会保留其子视图。


苹果当前推荐的最佳实践是将 IBOutlets 设置为 strong,除非在需要避免循环引用时才使用 weak。正如 Johannes 在上面提到的,在 WWDC 2015 的“在 Interface Builder 中实现 UI 设计”会议中,一位苹果工程师提到了这个问题:

最后一个选项是存储类型,可以是 strong 或 weak。通常情况下,你应该将 outlet 设置为 strong,特别是当你将 outlet 连接到一个子视图或者一个不会被视图层次结构一直保持的约束时。唯一需要将 outlet 设为 weak 的情况是当你有一个自定义视图引用了视图层次结构中的某个父视图,但一般不建议这样做。

我在Twitter上向 Interface Builder 团队的一位工程师询问了这个问题,他确认了 strong 应该是默认设置,并且开发者文档正在更新中。

https://twitter.com/_danielhall/status/620716996326350848
https://twitter.com/_danielhall/status/620717252216623104