2012-09-05 66 views

回答

5

你应该能够投它:

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

非常感谢!我现在就试试! – user1574429

+1

你不需要复制它。一个免费的桥梁演员字面上只是'NSArray * myNsArray =(NSArray *)myCfArray;' – jjv360

+0

这只适用于非ARC代码。 –

37

好了,首先你要知道,如果你正在使用ARC与否,因为规则的改变。接下来,你需要知道你真的想要对演员进行什么。你只是想使用价值,还是转让所有权?

我会认为ARC是因为IMO所有的新代码真的应该使用ARC(而ARC就是其中的投射问题更普遍)。

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

上面的代码连铸CF参考,可以在当前的上下文中使用的NSArray*。没有发生所有权转让。 someArrayRef仍然保留其参考,你仍然必须手动发布someArrayRef或它会泄漏。

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

在这段代码中,您不仅可以获得投票,而且可以转让所有权。 someArrayRef现在不再拥有引用,所以不需要手动发布。相反,当array版本发布时,该对象将释放(假设其他地方没有其他引用)。

+0

看起来像CFBridgingRelease是在ARC环境中走的路。始终转移到NS ...并使用CFBridgingRelease –