关于 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 只销毁本地指针值,不会销毁已传递出去的对象。 当myVarnil 时调用[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 基本上什么都不做。您需要负责使用retainreleaseautorelease,以及如何为函数命名,以有效管理内存使用情况。

【讨论】:

以上是关于关于 dealloc/release:做 x = nil; 总是可以的吗? [x 发布]; - 或者它会导致问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - dealloc - Release vs. nil

关于用MATLAB软件做数学实验的题目

用matlab如何做一个变量关于另一个变量的曲线

如果列表索引存在,做 X

高分求一个 flash as3.0的关于鼠标拖曳startDrag() 方法后 怎么获取拖曳后的坐标!!做凹透镜原理动画!

关于 x-requested-with 请求头 区分ajax请求还是普通请求