我需要在dealloc中发布IBOutlets吗?

时间:2011-01-21 12:21:24

标签: ios objective-c memory-leaks uiviewcontroller

我有一个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。所以我担心这两个版本就在这里。这是对还是错?有人可以向我解释一下,因为我一直有不同的意见......谢谢!

3 个答案:

答案 0 :(得分:8)

如果您的@property个对象被宣布为retaincopy,则需要在dealloc中释放它们。这包括你的网点。

答案 1 :(得分:1)

通过使用IBOutlet,变量暴露在Interface Builder中,并在初始化视图控制器时分配。因此,在卸载和取消分配视图控制器时,必须释放它们并取消分配。由于大多数IBOutlet都保留了UI *属性,因此这是必要的。

为变量分配nils在技术上不会解除分配。在实际被解除分配之前,它只是保留计数0的最后一个状态。

另外,请注意它们是使用self引用的。这意味着,视图控制器的引用变为nil,而不是分配。

因此,总之,必须在dealloc()

中发布IBOutlet属性

(虽然我很自信,其他人可能会为此提供100%正确答案。)

答案 2 :(得分:1)

基本的,安全的模式是

  • 宣布ivar
  • 为ivar声明IBOutlet属性
  • 在dealloc中发布属性
  • 仅参考属性,从不ivar

xib设置属性,释放可能存在的任何内容。

我有点困惑,为什么那里有泄漏。将属性设置为nil应该释放旧引用。也许viewDidUnload甚至没有被调用?你确定你甚至需要viewDidUnload吗?