【问题标题】:Casting a CFDictionaryRef to NSDictionary?将 CFDictionaryRef 转换为 NSDictionary?
【发布时间】:2011-10-24 12:19:03
【问题描述】:

我有代码(精简):

CFDictionaryRef *currentListingRef;
//declare currentListingRef here
NSDictionary *currentListing;
currentListing = (NSDictionary *) currentListingRef;

然后我得到错误:

非Objective-C指针类型'CFDictionaryRef *'(又名'const 结构 __CFDictionary **') 到 'NSDictionary *' 不允许使用 ARC

我做错了什么?如何从CFDictionaryRef 转换为NSDictionary

【问题讨论】:

    标签: objective-c xcode ios4 casting nsdictionary


    【解决方案1】:

    ARC 改变了桥接的工作方式。

    NSDictionary *original = [NSDictionary dictionaryWithObject:@"World" forKey:@"Hello"];
    CFDictionaryRef dict = (__bridge CFDictionaryRef)original;
    NSDictionary *andBack = (__bridge NSDictionary*)dict;
    NSLog(@"%@", andBack);
    

    【讨论】:

    • 反之如何?如,从“cfDict”制作“myNSDictionary”?
    • 我试过:currentListing = (__bridge NSDictionary *) currentListingRef; 并收到以下错误:“不兼容的类型将 'CFDictionaryRef *' (aka 'const struct __CFDictionary **') 转换为 'NSDictionary *' 与 __bridge cast "
    • 更新了如何双向的答案。您的代码的问题是您有 CFDictionarRef*,CFDictionaryRef 已经是一个指针类型。
    【解决方案2】:

    在 ARC 中,应该这样做:

    CFDictionaryRef currentListingRef = ...;
    NSDictionary *currentListing = CFBridgingRelease(currentListingRef);
    

    这会释放 CF 对象并将对象的所有权转移给 ARC 否则你应该手动释放 CF 对象。

    【讨论】:

    • CFBridgingRelease 是正确的,假设“...”表示您创建/复制了 CFDictionaryRef。虽然很可能是这种情况,但您并不总是希望转移
    【解决方案3】:

    试试这个代码,

    NSDictionary *ssidList = (__bridge NSDictionary*)myDict;
    NSString *SSID = [ssidList valueForKey:@"SSID"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2010-11-27
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多