关于dealloc / release:做x = nil总是可行的; [x发布]; - 还是会引起问题?

时间:2010-08-10 20:11:17

标签: objective-c memory-leaks release

因为对具有不同对象的变量的每次赋值都会增加其保留计数,而在dealloc中,并不总是清楚变量被赋值的频率[maVar release]可能不够充分。因此,使用ALWAYS myVar = nil将保留计数设置为零,后续[myVar release]将永远不会再导致问题。 (它实际上仍然需要吗?)

不这样做的唯一情况是,如果myVar传递给OUT,那么我不能这样做,因为myVar = nil会破坏该值;

我的想法是否正确?或者这种避免泄漏的方式是否会导致其他任何问题?

2 个答案:

答案 0 :(得分:3)

你的想法在很多方面都是错误的。这些可能只是表面上的问题:

  • 对变量的分配不会增加其保留计数。 (与房产有一些微妙之处,但坦率地说,这超出了我们在这里的水平。)
  • 当保留计数达到0 时,
  • dealloc被称为
  • 设置myVar = nil 不会影响保留计数
  • myVar = nil仅销毁本地指针值,它不会销毁已传出的对象。
  • [myVar release]myVar时,可以安全地致电nil,但它无用 - 它什么都不做。
  • 担心保留计数总是是一个错误。担心你拥有

很明显,你对C指针和Objective-C内存管理的掌握有点缺乏。我建议在几次彻底重新读取Memory Management docs之前做一些补救 C 工作。

答案 1 :(得分:1)

请阅读Memory Management上的Apple文档。

分配指向对象的指针不会增加retain计数,只调用retain就可以了。名称中带有Copy或Init的函数应该返回一个保留计数为1的对象,其他函数应该返回自动释放的对象,这些对象将在主循环结束时被释放。

将对象设置为nil不会修改保留计数,但会导致该内存泄漏。在那一点上对指针调用release基本上什么都不做。如果您想有效管理内存使用情况,则需要对使用retainreleaseautorelease以及如何命名功能负责。