似乎无法使用ARC从NSString *转换为CFString *

时间:2015-01-03 22:13:56

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

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

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

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

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

话说:

  来自' NSString * __ strong *'的C风格演员表到' CFStringRef *' (又名   ' const __CFString **')抛弃限定符

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

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

现在,我收到以下错误:

  

不兼容的类型施放&#NSString * __ strong *'到' CFStringRef *'   (又名' const __CFString **')与__bridge演员

它开始让我发疯...不管我似乎尝试过什么,我只是不能让错误消失。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我使用以下内容来获得实物

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