我使用ARC专门为iOS 5开发游戏。iboutlet到UIViews(和子类)是强还是弱?

以下几点:

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

就能摆脱这一切

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

做这个有什么问题吗?模板使用强,当从“接口生成器”编辑器直接连接到头部时,自动生成的属性创建,但为什么?UIViewController已经有一个强引用到它的视图,它保留了它的子视图。


当前回答

从WWDC 2015开始,有一个关于在界面生成器中实现UI设计的会议。在第32分钟左右,他说你总是想让你的@IBOutlet强大。

其他回答

我认为最重要的信息是: xib中的元素自动位于view的子视图中。Subviews是NSArray。NSArray拥有它的元素。等等都有强指针。所以在大多数情况下你不需要创建另一个强指针(IBOutlet)

使用ARC,你不需要在viewDidUnload中做任何事情

目前苹果推荐的最佳实践是iboutlet是强的,除非特别需要弱的以避免保留循环。就像Johannes上面提到的,在2015年WWDC的“在界面生成器中实现UI设计”会议上,一位苹果工程师说:

我想指出的最后一个选项是存储类型,它可以 要么坚强,要么软弱。一般来说,你应该做出口 强,特别是当你连接一个输出到子视图或 约束并不总是会被视图保留 层次结构。唯一真正需要使outlet弱的时候是if 您有一个自定义视图,它引用视图中的备份内容 等级制度,一般来说不建议这样做。

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

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

从WWDC 2015开始,有一个关于在界面生成器中实现UI设计的会议。在第32分钟左右,他说你总是想让你的@IBOutlet强大。

警告,过时的答案:根据WWDC 2015,这个答案不是最新的,正确答案参考上面的公认答案(丹尼尔·霍尔)。这个答案将被记录下来。


从开发人员库总结:

From a practical perspective, in iOS and OS X outlets should be defined as declared properties. Outlets should generally be weak, except for those from File’s Owner to top-level objects in a nib file (or, in iOS, a storyboard scene) which should be strong. Outlets that you create will therefore typically be weak by default, because: Outlets that you create to, for example, subviews of a view controller’s view or a window controller’s window, are arbitrary references between objects that do not imply ownership. The strong outlets are frequently specified by framework classes (for example, UIViewController’s view outlet, or NSWindowController’s window outlet). @property (weak) IBOutlet MyView *viewContainerSubview; @property (strong) IBOutlet MyOtherClass *topLevelObject;

在iOS开发中,NIB加载与Mac开发略有不同。

在Mac开发中,IBOutlet通常是一个弱引用:如果你有NSViewController的子类,只有顶级视图会被保留,当你释放控制器时,它的所有子视图和outlet都会自动释放。

UiViewController使用键值编码来设置出口使用强引用。当你dealloc你的UIViewController时,顶视图会自动释放,但你也必须在dealloc方法中释放它所有的outlet。

在这篇来自Big Nerd Ranch的文章中,他们讨论了这个话题,并解释了为什么在IBOutlet中使用强引用不是一个好的选择(即使在这种情况下苹果推荐它)。