我还需要在带有ARC的viewDidUnload中将IBOutlet属性设置为null吗?
因为它仍会生成以下注释:
//释放主视图的所有保留子视图。
答案 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。