关于 dealloc/release:做 x = nil; 总是可以的吗? [x 发布]; - 或者它会导致问题吗?
Posted
技术标签:
【中文标题】关于 dealloc/release:做 x = nil; 总是可以的吗? [x 发布]; - 或者它会导致问题吗?【英文标题】:About dealloc/release: is it always OK to do x = nil; [x release]; - or can it cause problems? 【发布时间】:2010-08-10 20:11:16 【问题描述】:由于对具有不同对象的变量的每次分配都会增加其保留计数,并且在 dealloc 中并不总是清楚变量被分配简单 [maVar release] 的频率可能不够。所以使用 ALWAYS myVar = nil
将保留计数设置为零,随后的 [myVar release]
将永远不会再次导致问题。 (它实际上仍然需要吗?)
不这样做的唯一情况是如果 myVar 被传出,那么我不能这样做,因为值会被myVar = nil
破坏;
我的想法对吗?或者这种避免泄漏的方式是否会导致任何其他问题?
【问题讨论】:
我想澄清一下,这个问题中的大多数陈述都是错误的。它们会导致错误的结论,这就是 user387184 感到困惑的原因。 谢谢你,马克——我不知道——感谢你的评论,我接受了之前给出的所有答案! 【参考方案1】:你的想法在很多方面都是不正确的。这些可能只是皮毛:
分配给变量不会增加其保留计数。 (与属性有一些微妙的关系,但坦率地说,这远远超出了我们目前的水平。)dealloc
在保留计数达到 0 时调用。
设置myVar = nil
不影响保留计数。
myVar = nil
只销毁本地指针值,不会销毁已传递出去的对象。
当myVar
是nil
时调用[myVar release]
是安全的,但它没有用——它什么都不做。
担心保留计数总是是个错误。担心你拥有的东西。
很明显,您对 C 指针和 Objective-C 内存管理的掌握有些欠缺。我建议在重读Memory Management docs 的几遍彻底 之前做一些补救C 工作。
【讨论】:
+1 技术更正:dealloc
在您 release
保留计数为 1 的对象时调用。从技术上讲,保留计数实际上从未减为 0。但是,对于一般理解内存管理,“当它达到0”的解释是可以的。 :)
@Dave,感谢您的更正。我会编辑它,但它可能会减损暴躁的语气;)
@walkytalky 没关系。无论如何,这更像是一个“仅供参考”的评论。 :)
感谢您的澄清 - XCode 中的以下测试真的让我很困惑:我在每个 self.niVar = [NSNumber numberWithInt:11] 之后打印了 [niVar retainCount]; => 每次分配后打印的保留计数都会增加。然后 self.niVar = nil; => 打印的保留计数显示为 0。那全错了!!!!!!你为我澄清的是,不应该打印保留计数来帮助发现潜在的内存问题。所以检查的唯一方法是彻底检查代码——对于初学者来说很难——因为在这些情况下,LEAK 工具相当有限。再次感谢!
@user387184 这正是正确的结论,干得好。只是为了解释您所看到的:增加的保留计数是因为您正在查看一个 property,大概声明为 retain
和 @synthesized
。 (self.niVar
可能看起来像一个变量,但它不是,它是一个方法调用。)减少到 0 是因为您不再查看该对象(该对象仍然存在于具有大量保留计数的某个地方),您是查看nil
,它的保留计数始终为0,因为它根本不是一个对象。无论如何,记住你的结论,你会更快乐!【参考方案2】:
请阅读 Apple 在 Memory Management 上的文档。
分配一个指向对象的指针不会增加retain
的计数,只有调用retain
才能做到这一点。名称中带有 Copy 或 Init 的函数应返回保留计数为 1 的对象,其他函数应返回自动释放的对象,这些对象将在主循环完成时被释放。
将对象设置为nil
不会修改保留计数,但会导致内存泄漏。此时在指针上调用release
基本上什么都不做。您需要负责使用retain
、release
、autorelease
,以及如何为函数命名,以有效管理内存使用情况。
【讨论】:
以上是关于关于 dealloc/release:做 x = nil; 总是可以的吗? [x 发布]; - 或者它会导致问题吗?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone - dealloc - Release vs. nil
高分求一个 flash as3.0的关于鼠标拖曳startDrag() 方法后 怎么获取拖曳后的坐标!!做凹透镜原理动画!