是否有必要释放ivar并同时将合成的ivar设置为零?

Boo*_*oon 9 objective-c

我已经看到代码(可能是Apple自己的示例代码)以这样的方式编写,它在dealloc中释放ivar并在viewDidUnload中设置属性.

例如

- (void)viewDidUnload
{
  self.navigationController = nil;
}

- (void)dealloc
{
   [_navigationController release];
}
Run Code Online (Sandbox Code Playgroud)

为什么他们在两个地方?另外,为什么将nil设置为一个并释放另一个.似乎self.property = nil会处理所有事情,因为它会释放并将ivar设置为nil.

Dan*_*son 5

你是对的:你确实可以self.property = nil在任何地方做,包括dealloc.唯一的缺点是,如果setter方法做的事情比释放ivar更复杂,你可能最终会尝试访问已经发布的其他字段等.

至于为什么你还要发布插座viewDidUnload,这是一个内存优化.由于您发布的内容viewDidUnload是在再次加载视图时将重新实例化的内容,因此释放它们会在内存不足的情况下释放内存.