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混合在一起,没有办法解决它。这很容易发生泄漏。如果没有明确说明保留计数的能力,我就会失明。
编辑:它是调试版本的工件。在发布版本中,后一种情况下的保留计数仍为2.在一个离开大型自动释放物体的碎片和一个没有自然释放物体的碎片之间存在切实的区别。你不希望前者在循环体中没有池的大循环中。有助于了解它是零优化的神器,但仍然不酷。
答案 0 :(得分:1)
bikePrice
CFStringRef cfs = ComesFromSomewhere();
// retainCount -> 1
NSString *ns = ToNS(cfs);
// ToNS(cfs)
//
// ToNS is not object creating method,
// thus the returned object was automatically autoreleased
// retainCount += 1
// NSString *ns
//
// It's __strong variable, ns variable has an ownership of the object
// retainCount += 1
// retainCount -> 3
的定义是一个方法,其名称以Objective-C类的“alloc”,“new”,“copy”或“mutableCopy”开头。请参阅Basic Memory Management Rules - You own any object you create。
在发布版本中,后一种情况下的保留计数仍为2.
如果符合条件,编译器也可以省略向对象发送自动释放消息。
<强> EDITED 强>
您可以使用C ++引用来避免自动释放。
object creating method
<强> EDITTED 强>
void ToNS(CFStringRef cfs, NSString __strong *& ns)
{
ns = (__bridge NSString*)cfs;
}
NSString *nsstr;
ToNS(cfstr, nsstr);
// retainCount -> 2
NS_RETURNS_RETAINED使框架将该函数视为创建一个(实际上是)的对象。 Cocoa有一个名称约定,允许您将方法指定为对象创建者,但约定仅适用于Objective C类方法,而不适用于C样式函数,而不适用于C ++类成员函数。