【发布时间】:2012-09-05 15:48:50
【问题描述】:
我知道有很多关于这个问题的信息,但每个答案都是“这很容易。你可以做免费的桥接。”,然后没有提到实际的源代码。 我知道免费桥接和投射的平均值。 我想知道确切的源代码“如何将 CFArrayRef 转换为 NSArray?” . 任何人请!!!!!!
【问题讨论】:
我知道有很多关于这个问题的信息,但每个答案都是“这很容易。你可以做免费的桥接。”,然后没有提到实际的源代码。 我知道免费桥接和投射的平均值。 我想知道确切的源代码“如何将 CFArrayRef 转换为 NSArray?” . 任何人请!!!!!!
【问题讨论】:
嗯,首先您必须知道您是否使用 ARC,因为规则会发生一些变化。接下来,你需要知道你真正想用你的演员做什么。您只想使用价值,还是转让所有权?
我会假设 ARC,因为,IMO,所有新代码都应该使用 ARC(而 ARC 是铸造问题更普遍的地方)。
CFArrayRef someArrayRef = ...;
NSArray *array = (__bridge NSArray*)someArrayRef;
以上代码将 CF 引用转换为可在当前上下文中使用的NSArray*。没有发生所有权转让。 someArrayRef 仍然保留它的引用,您仍然必须手动释放 someArrayRef 否则它会泄漏。
CFArrayRef someArrayRef = ...;
NSArray *array = CFBridgingRelease(someArrayRef);
在这段代码中,您不仅获得了演员阵容,而且还获得了所有权转移。 someArrayRef 现在不再持有引用,因此不需要手动释放。相反,当array 释放时,对象将释放(假设在其他地方没有其他引用)。
【讨论】:
你应该可以投射它:
CFArrayRef *myLegacyArray = ...
...
NSArray *myArray=[(NSArray *)myLegacyArray copy];
【讨论】:
NSArray* myNsArray = (NSArray*) myCfArray;