【问题标题】:Can't seem to cast from NSString* to CFString* using ARC似乎无法使用 ARC 从 NSString* 转换为 CFString*
【发布时间】:2015-01-03 22:13:56
【问题描述】:

我正在使用以下代码在 Objective-C(Mac OS X Cocoa 应用程序)中获取文件的文件类型:

NSString *kind = nil;
NSURL *url = [NSURL fileURLWithPath:[path stringByExpandingTildeInPath]];
LSCopyKindStringForURL((CFURLRef)url, (CFStringRef*)&kind);
return kind ? kind : @""; 

但是,产生的唯一错误是在以下行:

LSCopyKindStringForURL((CFURLRef)url, (CFStringRef*)&kind);

说:

从 'NSString *__strong *' 到 'CFStringRef *' 的 C 风格转换(又名 'const __CFString **') 抛弃限定符

在做了一些研究之后,我发现需要 __bridge 关键字才能使从 NSString* 到 CFStringRef* 的转换在 ARC 中有效。所以我坚持使用关键字,产生:

LSCopyKindStringForURL((CFURLRef)url, (__bridge CFStringRef*)&kind);

现在,我收到以下错误:

不兼容的类型将 'NSString *__strong *' 转换为 'CFStringRef *' (又名 'const __CFString **')带有 __bridge 演员表

它开始让我发疯......无论我似乎尝试什么,我都无法让错误消失。有什么想法吗?

【问题讨论】:

    标签: objective-c macos cocoa automatic-ref-counting cfstring


    【解决方案1】:

    有一个简单的解决方法。使用实际的CFStringRef 变量并在需要时将其转换为NSString

    NSURL *url = [NSURL fileURLWithPath:[path stringByExpandingTildeInPath]];
    CFStringRef kind;
    LSCopyKindStringForURL((CFURLRef)url, &kind);
    return kind ? CFBridgingRelease(kind) : @""; 
    

    【讨论】:

    • 我认为您在这里的内存管理是不正确的,但您可以摆脱它,因为LSCopyKindStringForURL 通常返回静态字符串(这实际上不需要内存管理)。我相信您在这里想要的是 return kind ? CFBridgingRelease(kind) : @"";CFStringRef 传递给 ARC 进行内存管理。
    • 是的,你是对的。我已经修复了代码。谢谢!
    【解决方案2】:

    我用下面的来讨好

        (NSURL *)path
        NSString *tempKind;
        [path getResourceValue:&tempKind forKey:NSURLLocalizedTypeDescriptionKey error:nil];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多