【问题标题】:Follow up viewDidUnload vs. dealloc question跟进 viewDidUnload 与 dealloc 的问题
【发布时间】:2011-02-20 02:56:23
【问题描述】:

作为后续的澄清问题:

What exactly must I do in viewDidUnload? When should I release objects in -(void)viewDidUnload rather than in -dealloc?

假设存在内存不足错误,并且视图被隐藏,并且调用了 viewDidUnload。我们做释放和零舞。后来不需要整个视图堆栈,所以调用了dealloc。因为我已经在 viewDidUnload 中有 release 和 nil 的东西,所以我在 dealloc 中没有它。完美。

但如果没有内存不足错误,则永远不会调用 viewDidUnload。调用了 dealloc,由于我没有 release 和 nil 的东西,所以存在内存泄漏。

换句话说,是否会在没有先调用 viewDidUnload 的情况下调用 dealloc?

实际的后续行动是,如果我在 viewDidLoad 中分配和设置某些东西,然后在 viewDidUnload 中释放它并设置为 nil,我是将其排除在 dealloc 之外,还是在 dealloc 中进行防御性 nil 检查如果不是 nil 则释放/nil?

【问题讨论】:

  • 你知道你可以发送 nil 发布消息没问题,对吧? nil 只是忽略发送给它的所有消息并返回 nil 作为它的值而没有错误。不需要像 NULL 那样对 nil 进行防御性检查

标签: iphone objective-c memory-management


【解决方案1】:

在两者中释放它。你不需要检查零。在 nil 上释放什么都不做。

但是,在 viewDidUnload 中不要释放无法在 viewDidLoad 中轻松重新创建的 ivars,以防再次加载视图。

通常(没有内存警告) viewDidUnload 不会被调用,只会调用 dealloc。

【讨论】:

  • 为了安全起见是的,但我只能想到一些重要的情况。我喜欢使用 setter 将其设置为 nil,因为它会在一行中释放它并将其设置为 nil(即:self.ivar=nil;)
  • 确实没有理由在dealloc 中将ivars 设置为nil。此外,在 dealloc(即self.ivar = nil)中使用 setter 也违反了 Apple 的建议,因为在部分释放的对象中使用 setter 可能会出现问题。使用 setter 可能不是问题,但为了 100% 安全,您可以改用 [ivar release]
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 2011-07-01
  • 2011-01-22
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多