NSHashTable 计数错误地报告非空

Posted

技术标签:

【中文标题】NSHashTable 计数错误地报告非空【英文标题】:NSHashTable count incorrectly reports non-empty 【发布时间】:2015-04-26 16:13:58 【问题描述】:

我正在使用一个弱对象 NSHashTable,它报告计数为 1,即使它是空的。以下是显示我的案例的 lldb 输出。

p [__operationWaitList count]
(NSUInteger) $4 = 1

p [__operationWaitList.allObjects count]
(NSUInteger) $7 = 0

我最好的猜测是count 计算存储在 NSHashTable 中的弱引用的数量而不是有效对象的数量。但是,通过调用 allObjects,我取消了指向发现没有有效对象的指针,因此结果对象数组为空。

我想确认这一点,因为在这一点上文档有点缺乏。

【问题讨论】:

__operationWaitList 是如何创建的?请发布此代码。 这种情况是否只发生在 LLDB 中,还是您运行代码中的问题? __operationWaitList = [NSHashTable weakObjectsHashTable]; 执行时也会出现问题。 【参考方案1】:

实验结果,非详尽测试,建议:

您的观察是正确的,count 返回哈希表中当前的引用数,其中一些可能为空。

正如您所观察到的,allObjects.count 始终返回非空引用的数量。

添加新的不同对象似乎可以清除空引用。

关于这个问题的文档不清楚。

建议您向 Apple 提交错误报告,他们应该修复实现或文档。

【讨论】:

感谢您的确认。 Apple 对此错误做出了回应,并坚称该行为符合预期。他们为文档修复打开了一个错误,但可以更好地解释该行为。它们还表明对allObjects 的两次调用可能导致对象留在自动释放池中。

以上是关于NSHashTable 计数错误地报告非空的主要内容,如果未能解决你的问题,请参考以下文章

用于错误报告的Stackdriver监视指标?

具有弱引用的 NSHashTable

Cocoa 集合类型:NSPointerArray,NSMapTable,NSHashTable

如何在数组php中仅获取非空元素计数

NSHashtable and NSMaptable

Pyspark 计数非空值之间的空值