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

以下几点:

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

就能摆脱这一切

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

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


当前回答

这几年似乎发生了一些变化,现在苹果建议一般使用strong。在他们的WWDC会议的证据是在会议407 -实现UI设计的界面生成器,并开始于32:30。我从他的话中摘录(如果不是完全引用的话,也几乎是引用了他的话):

Outlet连接通常应该是强的,特别是当我们连接的子视图或约束并不总是由 视图层次 在创建自定义视图时,可能需要弱出口连接,因为自定义视图引用了视图层次结构中的备份内容 一般来说不建议这样做

在其他方面,它应该总是强的只要我们的一些自定义视图没有与视图层次结构中的一些视图创建一个保留循环

编辑:

有些人可能会问这个问题。用强引用保存它是否不会创建一个保留循环作为根视图控制器而所属视图保留对它的引用?或者为什么会发生这种变化? 我想答案在这个演讲的前面,当他们描述如何从xib创建nib时。为VC和视图创建了一个单独的nib。我认为这可能是他们改变建议的原因。不过,如果能从苹果那里得到更深入的解释就好了。

其他回答

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

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

虽然文档建议在子视图的属性上使用weak,但从iOS 6开始,使用strong(默认的所有权限定符)似乎是可以的。这是由UIViewController中的变化引起的视图不再被卸载。

在ios6之前,如果你保持强链接到控制器视图的子视图,如果视图控制器的主视图被卸载,只要视图控制器还在,那些就会保留子视图。 自iOS 6以来,视图不再被卸载,而是加载一次,然后只要它们的控制器还在,视图就会一直存在。所以强属性无关紧要。它们也不会创建强引用循环,因为它们向下指向强引用图。

也就是说,我在使用之间犹豫不决

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

and

@property (nonatomic) IBOutlet UIButton *button;

iOS 6及以后版本:

使用weak清楚地表明控制器不想要按钮的所有权。 但是省略weak在iOS 6中没有视图卸载,而且更短。有些人可能会指出,这也更快,但我还没有遇到过因为iboutlet太弱而太慢的应用程序。 不使用weak可能会被认为是错误。

底线:自从iOS 6以来,只要我们不使用视图卸载,我们就不会再犯这个错误了。聚会时间到了。;)

这几年似乎发生了一些变化,现在苹果建议一般使用strong。在他们的WWDC会议的证据是在会议407 -实现UI设计的界面生成器,并开始于32:30。我从他的话中摘录(如果不是完全引用的话,也几乎是引用了他的话):

Outlet连接通常应该是强的,特别是当我们连接的子视图或约束并不总是由 视图层次 在创建自定义视图时,可能需要弱出口连接,因为自定义视图引用了视图层次结构中的备份内容 一般来说不建议这样做

在其他方面,它应该总是强的只要我们的一些自定义视图没有与视图层次结构中的一些视图创建一个保留循环

编辑:

有些人可能会问这个问题。用强引用保存它是否不会创建一个保留循环作为根视图控制器而所属视图保留对它的引用?或者为什么会发生这种变化? 我想答案在这个演讲的前面,当他们描述如何从xib创建nib时。为VC和视图创建了一个单独的nib。我认为这可能是他们改变建议的原因。不过,如果能从苹果那里得到更深入的解释就好了。

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

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

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

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

注意,IBOutletCollection应该是@property(强,非原子)。