如何将CFArrayRef转换为NSArray?

10

可能是重复问题:
如何将CFArrayRef转换为NSMutableArray

我知道有很多关于这个问题的信息,但每个答案都是"这很容易。你可以进行桥接强制转换",然后就没有提到实际的源代码。 我知道桥接和强制转换的意思。 我想知道确切的源代码"如何将CFArrayRef转换为NSArray?"。 麻烦有人能帮忙!!!!

2个回答

40

首先你需要知道你是否在使用ARC,因为规则会有一些变化。其次,你需要知道你想要用你的转换做什么。你是只想使用这个值,还是要转移所有权?

我会假设你在使用ARC,因为在我看来,所有新代码都应该使用ARC(而且ARC是转换问题更普遍的地方)。

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

以上代码将CF引用转换为NSArray*,以便在当前上下文中使用。没有所有权的转移发生。someArrayRef仍然保留其引用,您仍然必须手动释放someArrayRef,否则它将泄漏。

CFArrayRef someArrayRef = ...;
NSArray *array = CFBridgingRelease(someArrayRef);
在这段代码中,你不仅得到了一个类型转换,还得到了所有权的转移。someArrayRef现在不再持有该引用,因此无需手动释放。相反,当array释放时,对象将被释放(假设其他地方没有其他引用)。

看起来在ARC环境下,CFBridgingRelease是最好的选择。始终转换为NS...并使用CFBridgingRelease。 - user4951

5

你应该能够投射它:

CFArrayRef *myLegacyArray = ...

...

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

2
一个免费的桥接转换就是 NSArray* myNsArray = (NSArray*) myCfArray; - jjv360
那只适用于非 ARC 代码。 - Jody Hagins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接