问题标签 [retaincount]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2187 浏览

objective-c - 添加到数组时保留计数会增加吗?

我只是想知道:如果将对象添加到Objective-C中的数组或字典中,它的保留计数会增加吗?我可以在将特定对象添加到数组或字典后立即释放它吗?

0 投票
2 回答
559 浏览

objective-c - 谁能解释一下这个保留计数代码中发生了什么?

0 投票
3 回答
635 浏览

objective-c - 保留合成属性的计数

请查看我的代码:

请看第23行, NSLog(@"%d", (int)[[objA objB] retainCount]);

我认为结果应该是 2 而不是 3,但每次调用[objA objB]似乎都会将保留计数增加 1。我不知道发生了什么。谁能告诉我?谢谢!

0 投票
2 回答
5907 浏览

objective-c - 调用 -retainCount 被认为是有害的

或者,为什么我没有retainCount在暑假使用

这篇文章旨在征求关于这种臭名昭著的方法的原因和原因的详细文章,retainCount以整合围绕 SO 浮动的相关信息。*

  1. 基础知识:不使用的官方原因是什么retainCount?是否有任何可能有用的情况?应该怎么做?** 随意编辑。

  2. 历史/解释:如果不打算使用,为什么 Apple 会在NSObject协议中提供此方法?retainCountApple的代码是否出于某种目的而依赖?如果是这样,为什么不把它藏在某个地方?

  3. 为了更深入地理解:对象的保留计数可能与用户代码中假设的不同的原因是什么?您能否给出框架代码可能使用的标准过程的任何示例***,这些示例会导致这种差异?是否存在任何已知情况,其中保留计数总是与新用户的预期不同?

  4. 你认为还有什么值得一提的retainCount吗?


* 不熟悉 Objective-C 和 Cocoa 的编码人员经常会遇到或至少误解引用计数方案。教程解释可能会提到保留计数,它(根据这些解释)在您调用retainalloccopy等时增加一,在您调用时减少一release(以及在将来的某个时间调用autorelease)。

因此,一个崭露头角的 Cocoa 黑客 Kris 可以很容易地得出这样的想法:检查对象的保留计数将有助于解决一些内存问题,而且,你瞧,每个对象都有一个可用的方法,称为retainCount! Kris调用retainCount了几个对象,这个太高了,那个太低了,这到底是怎么回事?!所以 Kris 在 SO 上发了一个帖子,“我的内存管理出了什么问题?” 然后一大群 <bold>、<large> 字母下降说“不要那样做!你不能依赖结果。”这很好,但我们勇敢的编码员可能需要更深入的解释。

我希望这会变成一个常见问题解答,这是一页来自我们任何一位倾向于撰写一篇文章的专家的优秀信息论文/讲座,当新的 Cocoa-heads 对retainCount.

** 我不想把它说得太宽泛,但是来自经验的具体提示或关于验证/调试保留和释放配对的文档可能在这里是合适的。

***在虚拟代码中;显然,公众无法访问 Apple 的实际代码。

0 投票
3 回答
1098 浏览

iphone - 对象保留计数

我分配了一个这样的对象:

那么object的retaincount为1。

然后我就这样了......

然后保留计数增加到 2。为什么?

这是我的代码。即使释放对象ob后,也会发生内存泄漏。为什么?

0 投票
2 回答
328 浏览

objective-c - 交叉保留麻烦

当两个对象相互保留时,如何绕过交叉保留情况?

考虑这个类结构:

容器.h

容器.m

然后在测试内存保留计数时:

因此,据我了解,保留计数应该显示正确的计数。但是我最终如何真正解除分配对象,因为在这段代码之后,这两个对象将留在内存中。

0 投票
1 回答
396 浏览

iphone - UIView 未正确释放

我有大量的视图/视图控制器层次结构。
在主控制器中,我有以下代码,其中 aViewController 是 MyClass 的成员:

运行它时,我看到它aViewController永远不会被释放 - 保留计数最后仍然是 1。
如果我添加[aViewController_.view removeFromSuperview];到 dealloc 中,一切正常。

为什么是这样?不[super dealloc]应该关心视图的释放吗?在控制器之后释放视图是否重要?

我试图用一个简单的测试应用程序重现,但没有任何运气。

0 投票
3 回答
1305 浏览

objective-c - 块捕获对象的过度释放问题;保留计数直接从 +2 跳到 0!

我对我看到的偶尔崩溃感到困惑,根据 Zombies 工具,这是由某些字典值的过度释放引起的。当我查看 Instruments 中这些过度释放对象之一的对象历史记录时,我发现它的保留计数在某个阶段直接从 +2 下降到 0。(请看帖子末尾的屏幕截图)。我不清楚这怎么可能。

我应该说我只在使用 Instruments 进行分析时才看到这个崩溃,所以我想这可能是一个 Apple 错误,但假设它是 Pilot 错误可能更安全,而 Instruments 只是暴露了这个错误。

无论如何,我正在构建一个包含一些核心基础对象(CFStrings 和 CFNumbers)的 CFDictionary,然后我将其转换为 NSDictionary* 并将其传递给 Objective-C 方法。我的代码的简化版本如下:

我曾认为str1,str2num1将被视为 Objective-C 对象,因此会-receiveDictionary:在调用复制块 in 时被捕获并自动保留dispatch_async,并在释放该块时释放。实际上,这些变量似乎确实被块捕获和保留。但是,检查 Instruments 中过度释放的 CFString 的对象历史记录,我可以看到在复制块时它的引用计数正在增加。令人困惑的是,当一个块被释放时,它的保留计数从 +2 直接下降到 0(见帖子末尾的截图);我不知道如何从堆栈跟踪中判断这是哪个块。到时候CFRelease在块中的字典上调用doStuff(),它的一些值已经被释放,程序崩溃了。

那么额外的发布调用是从哪里来的呢?正如 Instruments 所指出的,一个对象的保留计数如何从 +2 直接下降到 0?

一时兴起,我强迫第二个块保留整个字典,如下所示:

这似乎使崩溃消失了;仪器至少停止报告僵尸。不过,我终其一生都无法理解为什么会这样。当然,我只是为了确保该块保留我感兴趣的字典值,而不是整个字典。发生什么了?


Instruments 列出了僵尸 CFString 的以下对象历史记录,以及对象的保留计数。我已经包含了有趣事件的屏幕截图。

#0 +1 CFString 已创建
#1 +2 CFString 添加到字典
#2 +1 CFString 已释放
#3 +2 CFString 在-receiveDictionary:复制
块时保留 #4 +0什么...?对象的保留计数从 +2 直接下降到 0!
#5 -1 CFDictionary 被释放,导致崩溃

0 投票
2 回答
264 浏览

objective-c - NSMutableArray 即将发布?

我有一个 NSMutableArray,其属性为(非原子,保留),并且由于某种原因它被释放,这是我分配它时的代码(tableData 是 NSMutableArray):

当我分配它时,它的保留计数为 1。当我将它分配给 tableData 时,它的保留计数为 2。然后使用自动释放,在 runloop 结束时它应该变为 1(这是我想要的)。但这不会发生。后来,当我引用它并运行一个方法时,我得到了随机对象(上次是 UITabBarSwappableImageView),它说发送了无法识别的选择器。这是有道理的...该对象正在被释放,而其他一些对象正在取代它...但是为什么要释放它?谢谢。

0 投票
1 回答
232 浏览

objective-c - 另一个“保留,然后释放”问题

作为一个 Cocoa/Obj-C 新手,我正在阅读 Aaron Hillegass 的“Mac OS X 的 Cocoa 编程”一书 - 撇开现在我们也有机会使用 GC 来避免所有这些推理的事实不谈 - 我不是当然,我知道其中一些保留的原因。

特别是在 Aaron 给出的一个良好编程实践的例子中:

我不明白在方法的第一行保留 x 实例的原因:

这个实例的范围只是 set 方法,对吧?退出方法范围时,无论如何都应该释放 x 实例,不是吗?此外,当将 x 分配给 foo 时:

foo 无论如何都会指向 x 个内存单元,因此会增加指向的对象保留计数,不是吗?这应该确保内存不会被释放。

那么,有什么意义呢?当然,我确信我错过了一些东西,但不知道到底是什么。

谢谢,法布里齐奥