我有一个View Controller作为带有两个IBOutlets的导航控制器堆栈的一部分。在viewDidUnload中,我释放它们:
- (void)viewDidUnload
{
self.myView1 = nil;
self.myView2 = nil;
[super viewDidUnload];
}
但我仍然有泄漏。所以我也在dealloc中发布了释放消息:
- (void)dealloc
{
[myView1 release];
[myView2 release];
[super dealloc];
}
这似乎可以清除内存泄漏。但是,我总是被告知我应该仅发布我使用alloc,copy或new创建的ivars。所以我担心这两个版本就在这里。这是对还是错?有人可以向我解释一下,因为我一直有不同的意见......谢谢!
答案 0 :(得分:8)
如果您的@property
个对象被宣布为retain
或copy
,则需要在dealloc
中释放它们。这包括你的网点。
答案 1 :(得分:1)
通过使用IBOutlet,变量暴露在Interface Builder中,并在初始化视图控制器时分配。因此,在卸载和取消分配视图控制器时,必须释放它们并取消分配。由于大多数IBOutlet都保留了UI *属性,因此这是必要的。
为变量分配nils在技术上不会解除分配。在实际被解除分配之前,它只是保留计数0的最后一个状态。
另外,请注意它们是使用self引用的。这意味着,视图控制器的引用变为nil,而不是分配。
因此,总之,必须在dealloc()
中发布IBOutlet属性(虽然我很自信,其他人可能会为此提供100%正确答案。)
答案 2 :(得分:1)
基本的,安全的模式是
xib设置属性,释放可能存在的任何内容。
我有点困惑,为什么那里有泄漏。将属性设置为nil应该释放旧引用。也许viewDidUnload甚至没有被调用?你确定你甚至需要viewDidUnload吗?