繁体   English   中英

我仍然需要在使用ARC的viewDidUnload中将IBOutlet属性设置为null

[英]Do I still need to set IBOutlet properties to null in viewDidUnload with ARC

我还需要在使用ARC的viewDidUnload中将IBOutlet属性设置为null吗?

因为它仍然会生成以下注释:

//释放主视图的所有保留子视图。

那么nilling出口的主要目的是在视图从视图控制器卸载时,不会创建当子视图没有超级视图时可能发生的僵尸,泄漏和奇怪的情况。

现在使用最新版本的Xcode,如果你在一个标题或私有声明中拖动一个视图元素,它会自动将Outlet设置为弱(目标iOS> = 5),并且在viewDidUnload方法中它将写入[self setYourOutlet:nil]; 可能在这种情况下没有必要,但这是一个很好的做法。 如果你的目标是较低的需要,因为你不能使用弱引用。 我建议总是使用,因为这是一个好习惯。

UPDATE

我想完成答案以避免误解(仅谈论iOS5)注意只有当主视图的子视图时,IB才会设置弱点。 通常,它发生在包含视图控制器视图的xib中。

有时可能会发生需要在运行时根据某些条件交换两个视图而无需以编程方式或在不同的xib中创建它们。 例如,您的主视图由vc拥有,并且在同一个xib中,您创建了另外两个视图,在那一刻没有超视图。 如果您尝试使用相同的技术连接它们,则创建的引用将很strong 在运行时,您现在可以交换视图,只需在superview中添加或删除,当然您应该在viewDidUnload中将它们取消。

我将在这里对安德烈的回答扩大(给予好评他!),因为答案是不是直线前进,除非你只意味着UI组件,在这种情况下,他们应该是弱。

IBOutlets是您定义它们的任何东西。 如果您使用:

@property (nonatomic, strong) IBOutlet UIView *someView;

在卸载父视图/窗口时,您应该这样做。

如果你这样做:

@property (nonatomic, weak) IBOutlet __weak UIView *someView;

您不必将变量设为零,因为它将自动归零。

你怎么样都完全取决于你。 ARC之前我使用过:

[someView_ release], someView_ = nil;

现在您有两个选择:使用setter(使用@synthesize创建)或直接设置底层ivar。 结果是相同的 - 在这两种情况下,对象的生命周期限定符都会注意到它的最终用途并将其释放。

所以,继续这样做:

self.someView = nil

要么

@synthesize someView = someView_;
...
someView_ = nil;

对于标记为强大的IBOutlet,您仍然希望在viewDidUnload中将它们取出。

为什么:

当您收到内存不足通知时,当前未显示的任何视图可能会自行卸载(调用viewDidUnload)以节省内存。 通过缩小您的网点,您放弃了所有权并让它们被释放。 再次加载视图时(再次显示),将再次设置出口并调用viewDidLoad。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM