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

时间:2012-05-17 15:00:11

标签: iphone objective-c

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

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

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

3 个答案:

答案 0 :(得分:13)

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

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

更新

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

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

答案 1 :(得分:11)

我会在这里扩展Andrea的答案(upvote他!)因为答案不是直截了当的,除非你只是指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;

答案 2 :(得分:2)

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

<强>为什么:

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