【问题标题】:How to convert CFArrayRef to NSArray? [duplicate]如何将 CFArrayRef 转换为 NSArray? [复制]
【发布时间】:2012-09-05 15:48:50
【问题描述】:

可能重复:
How to make an CFArrayRef to an NSMutableArray

我知道有很多关于这个问题的信息,但每个答案都是“这很容易。你可以做免费的桥接。”,然后没有提到实际的源代码。 我知道免费桥接和投射的平均值。 我想知道确切的源代码“如何将 CFArrayRef 转换为 NSArray?” . 任何人请!!!!!!

【问题讨论】:

    标签: iphone ios nsarray


    【解决方案1】:

    嗯,首先您必须知道您是否使用 ARC,因为规则会发生一些变化。接下来,你需要知道你真正想用你的演员做什么。您只想使用价值,还是转让所有权?

    我会假设 ARC,因为,IMO,所有新代码都应该使用 ARC(而 ARC 是铸造问题更普遍的地方)。

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

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

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

    在这段代码中,您不仅获得了演员阵容,而且还获得了所有权转移。 someArrayRef 现在不再持有引用,因此不需要手动释放。相反,当array 释放时,对象将释放(假设在其他地方没有其他引用)。

    【讨论】:

    • 看起来 CFBridgingRelease 是 ARC 环境中的方法。始终转移到 NS... 并使用 CFBridgingRelease
    【解决方案2】:

    你应该可以投射它:

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

    【讨论】:

    • 非常感谢!我马上试试!
    • 你不需要复制它。免费的桥梁演员实际上只是NSArray* myNsArray = (NSArray*) myCfArray;
    • 这仅适用于非 ARC 代码。
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2016-08-05
    • 2014-10-19
    • 2016-07-05
    • 2011-06-01
    • 2010-12-18
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多