2011-01-21 30 views
1

我有一个视图控制器作为导航控制器堆栈的一部分与两个IBOutlets。在viewDidUnload我释放他们:我是否需要在dealloc中释放IBOutlets?

- (void)viewDidUnload 
{ 
    self.myView1 = nil; 
    self.myView2 = nil; 
    [super viewDidUnload]; 
} 

但我仍然有泄漏。所以我坚持发布消息dealloc他们也:

- (void)dealloc 
{ 
    [myView1 release]; 
    [myView2 release]; 

    [super dealloc]; 
} 

这似乎清除内存泄漏。但是,我总是被告知我应该只使用发布我使用alloc,copy或new创建的ivars。所以我很担心这两个版本在这里。这是对还是错?有人可以向我解释这一点,因为我不断收到矛盾的意见......谢谢!

回答

8

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

+2

谢谢。我听说过“分配,复制或保留”的规则,但并没有真正考虑到XIB在加载时保留它的事实。我会尝试并将其刻入我的脑海! – jowie 2011-01-23 18:35:30

1

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

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

此外,请注意,他们是使用自我引用。这意味着,来自视图控制器的引用变为零,而不是分配。

所以在最后,IBOutlet中属性必须在的dealloc()释放

(虽然我相当有信心,别人可以为此提供100%的正确答案。)

+0

如果您使用点格式化访问器将您的属性设置为零,并且您的属性属于(保留)类型,那么您将释放先前存在的任何对象。属性设置器看起来像这样(伪代码)[myProperty release]; myProperty = newObject; [newObject retain]; – averydev 2011-04-10 01:10:56

1

基本,安全模式

  • 声明伊娃
  • 申报伊娃在dealloc中
  • 释放性IBOutlet中财产
  • 只是参考性质,从来没有伊娃

的厦门国际银行设置属性,它释放任何可能已经有第一位。

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

+0

是的,viewDidUnload永远不会被调用。我一直在四处看看Stack,很多人也这样说...我猜操作系统缓存它以防万一需要它吗?我认为viewDidUnload在有内存警告时会被调用,但它不是给定的。 – jowie 2011-01-23 18:30:56

相关问题