【发布时间】:2015-09-25 23:12:10
【问题描述】:
iOS,正在过渡到 ARC。我观察到关于 CF/NS 桥接的奇怪行为。在以下场景中:
CFStringRef cfs = ComesFromSomewhere();
NSString *ns = (__bridge NSString*)cfs;
字符串对象的保留计数最后为 2。但是,在以下方面:
NSString *ToNS(CFStringRef cfs)
{
return (__bridge NSString*)cfs;
}
CFStringRef cfs = ComesFromSomewhere();
NSString *ns = ToNS(cfs);
最后保留计数为 3。请问这是怎么回事?谁拥有额外的参考?对象是否只是通过传递而被添加到自动释放池中?
对“别担心,ARC 正常工作”的抢先反应:我在这里将 Core Foundation 与 Cocoa 混合在一起,没有办法。这很容易泄漏。如果无法明确说明保留计数,我就瞎了。
编辑:它是调试版本的工件。在release build中,后一种情况下的retain count还是2。
在留下大型自动释放对象的片段和不留下的片段之间存在明显的区别;您不希望前者在循环体中没有池的大循环中。有助于了解它是零优化的产物,但仍然不酷。
【问题讨论】:
-
你有调试手表或变量上的其他东西吗?这可能会使变量保持活动状态,您可以对其进行检查。
-
不考虑差异。该函数没有引入额外的变量,没有什么可看的。
-
仪器工具
leaks在这种情况下可能会有所帮助,尽管有时这就像大海捞针一样。 -
没有泄漏,我已经检查过了。它真的看起来像一个隐藏的保留/自动释放。但我更喜欢确认。
-
“如果无法明确说明保留计数,我就瞎了眼。”如果您使用静态分析器,则不会。它会告诉你是否对内存管理不善。
标签: ios automatic-ref-counting