我使用ARC专门为iOS 5开发游戏。iboutlet到UIViews(和子类)是强还是弱?
以下几点:
@property (nonatomic, weak) IBOutlet UIButton *button;
就能摆脱这一切
- (void)viewDidUnload
{
// ...
self.button = nil;
// ...
}
做这个有什么问题吗?模板使用强,当从“接口生成器”编辑器直接连接到头部时,自动生成的属性创建,但为什么?UIViewController已经有一个强引用到它的视图,它保留了它的子视图。
虽然文档建议在子视图的属性上使用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以来,只要我们不使用视图卸载,我们就不会再犯这个错误了。聚会时间到了。;)
警告,过时的答案:根据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;