Objective c 关于解除锁定/释放:执行x=nil是否总是可以的;[x发布];-还是会引起问题?

Objective c 关于解除锁定/释放:执行x=nil是否总是可以的;[x发布];-还是会引起问题?,objective-c,memory-leaks,release,Objective C,Memory Leaks,Release,由于对具有不同对象的变量的每次赋值都会增加其保留计数,并且在dealoc中,并不总是清楚变量被赋值的频率,简单的[maVar release]可能是不够的。因此,使用ALWAYSmyVar=nil将保留计数设置为零,后续的[myVar释放]将不会再次导致问题。(实际上仍然需要吗?) 不这样做的唯一情况是,如果myVar被传递出去,那么我不能这样做,因为值被myVar=nil破坏 我的想法正确吗?或者这种避免泄漏的方法会导致其他问题吗?请阅读苹果公司的文档 将指针指定给对象不会增加retain计数

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

不这样做的唯一情况是,如果myVar被传递出去,那么我不能这样做,因为值被
myVar=nil
破坏


我的想法正确吗?或者这种避免泄漏的方法会导致其他问题吗?

请阅读苹果公司的文档

将指针指定给对象不会增加
retain
计数,只有调用
retain
才能增加计数。名称中包含Copy或Init的函数应返回retain计数为1的对象,其他函数应返回自动释放的对象,这些对象将在主循环完成时解除锁定


将对象设置为
nil
不会修改保留计数,但会导致内存泄漏。在该点上对指针调用
release
,实际上没有任何作用。如果您想有效管理内存使用,您需要负责使用
retain
release
autorelease
,以及如何命名功能。

请阅读上的苹果文档

将指针指定给对象不会增加
retain
计数,只有调用
retain
才能增加计数。名称中包含Copy或Init的函数应返回retain计数为1的对象,其他函数应返回自动释放的对象,这些对象将在主循环完成时解除锁定


将对象设置为
nil
不会修改保留计数,但会导致内存泄漏。在该点上对指针调用
release
,实际上没有任何作用。如果你想有效地管理你的内存使用,你需要负责使用
retain
release
autorelease
,以及如何命名你的函数。

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

  • 分配给变量不会增加其保留计数。(房地产有一些微妙之处,但坦率地说,这远远超出了我们目前的水平。)
  • 当保留计数达到0时,调用
    dealloc
  • 设置
    myVar=nil
    不会影响保留计数
  • myVar=nil
    只销毁本地指针值,不销毁已传递的对象
  • myVar
    nil
    时,调用
    [myVar release]
    是安全的,但它没有用处——它什么都不做
  • 担心保留计数总是一个错误。担心你所拥有的

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

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

  • 分配给变量不会增加其保留计数。(房地产有一些微妙之处,但坦率地说,这远远超出了我们目前的水平。)
  • 当保留计数达到0时,调用
    dealloc
  • 设置
    myVar=nil
    不会影响保留计数
  • myVar=nil
    只销毁本地指针值,不销毁已传递的对象
  • myVar
    nil
    时,调用
    [myVar release]
    是安全的,但它没有用处——它什么都不做
  • 担心保留计数总是一个错误。担心你所拥有的

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

我想澄清一下,在这个问题上所做的大多数陈述都是错误的。它们会导致错误的结论,这就是用户387184感到困惑的原因。谢谢马克-我不知道-谢谢你的评论,我接受了前面给出的所有答案!我想澄清的是,在这个问题上所作的大多数陈述都是错误的。它们会导致错误的结论,这就是用户387184感到困惑的原因。谢谢马克-我不知道-谢谢你的评论,我接受了前面给出的所有答案+1技术更正:
dealloc
在释放保留计数为1的对象时调用。从技术上讲,保留计数从未实际减少到0。但是,对于内存管理的一般理解,“当它达到0时”的解释是可以的:@戴夫,谢谢你的更正。我会把它编辑进去,但这可能会影响易怒的语气;)@随身听,没关系。无论如何,这更像是一个“仅供参考”的评论。:)感谢您的澄清-下面在XCode中的测试真的让我困惑:我在每个self之后打印了[niVar retainCount]。niVar=[NSNumber numberwhithint:11];=>每次分配后,打印保留计数增加。然后self.niVar=nil;=>打印保留计数显示为0。那都错了!!!!!您向我澄清的是,不应该打印保留计数来帮助查找潜在的内存问题。因此,检查的唯一方法是彻底检查代码——对初学者来说很难——因为泄漏工具是老鼠