1

我正在使用以下代码在 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);

现在,我收到以下错误:

使用 __bridge 强制转换将 'NSString *__strong *' 转换为 'CFStringRef *'(又名 'const __CFString **')的不兼容类型

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

4

2 回答 2

2

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

NSURL *url = [NSURL fileURLWithPath:[path stringByExpandingTildeInPath]];
CFStringRef kind;
LSCopyKindStringForURL((CFURLRef)url, &kind);
return kind ? CFBridgingRelease(kind) : @""; 
于 2015-01-03T22:26:24.403 回答
0

我使用以下内容来获得善意

    (NSURL *)path
    NSString *tempKind;
    [path getResourceValue:&tempKind forKey:NSURLLocalizedTypeDescriptionKey error:nil];
于 2015-01-03T23:25:05.723 回答