【问题标题】:release Vs nil -- Best Practicerelease Vs nil -- 最佳实践
【发布时间】:2011-05-12 08:56:04
【问题描述】:

当我们为类变量分配内存时,我们应该释放它还是在dealloc方法中将它设置为nil?最佳做法是什么?

【问题讨论】:

  • 你能解释一下“类变量”是什么意思吗?

标签: iphone objective-c cocoa-touch


【解决方案1】:

最佳实践:

[foo release]; // ensures that memory is released
foo = nil; // ensures that there is no dangling pointer to released memory

其他说明:

当您分配给声明为保留的属性时,

// in your .h
@property (retain) MyObject *foo;

// in your .m
self.foo = bar; // bar is retained; whatever foo previously pointed at is released

它会释放它之前指向的东西并保留被分配的新对象。

所以,你可以使用:

self.foo = nil;

它会释放 foo 指向的任何东西。 但是,如果您的属性没有声明为保留存储语义,这不会隐式释放 foo 指向的任何内容。此外,正如 Ryan 指出的那样,可以覆盖属性以产生副作用。因此,最好遵循始终使用的模式:

[foo release];

为确保您没有指向已释放内存的悬空指针,您可以执行以下操作:

foo = nil;

如果您不使用具有保留语义的属性,您需要释放存储在变量中的任何内容:

[foo release];

编辑:另请参阅以下对另一个问题的回答:

iPhone - dealloc - Release vs. nil

【讨论】:

  • 始终使用 -release 而不是属性设置器更安全,因为设置器可以被覆盖以产生副作用。您不希望在您的 dealloc 方法中发生副作用。
  • 另外,这篇博文为我澄清了很多red-sweater.com/blog/1423/dont-coddle-your-code
  • 我经常发现在发布后显式分配nil 可以掩盖错误。如果有人在之后访问 ivar,这是一个错误,并且分配 nil 都可以让这成功而没有任何明显的错误,并阻止使用任何内存调试工具。
  • 很好的答案 - 起初我这样做:[self.myVar release]; self.myVar = nil;这导致 myVar 的 dealloc 部分崩溃,它被释放了两次>但是我绕过了该属性,只是简单地执行 [myVar release] myVar = nil;一切都很好。为什么第一种方法不起作用?
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2010-10-04
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多