似乎无法使用 ARC 从 NSString* 转换为 CFString*
Can't seem to cast from NSString* to CFString* using ARC
我正在使用以下代码在 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);
说:
C-style cast from 'NSString *__strong *' to 'CFStringRef *' (aka
'const __CFString **') casts away qualifiers
经过一些研究,我发现需要 __bridge
关键字才能使从 NSString* 到 CFStringRef* 的转换在 ARC 中有效。所以我坚持使用关键字,产生:
LSCopyKindStringForURL((CFURLRef)url, (__bridge CFStringRef*)&kind);
现在,我收到以下错误:
Incompatible types casting 'NSString *__strong *' to 'CFStringRef *'
(aka 'const __CFString **') with a __bridge cast
它开始让我发疯了...无论我尝试什么,我就是无法让错误消失。有什么想法吗?
有一个简单的解决方法。使用实际的 CFStringRef
变量,并在需要 return 时将其转换为 NSString
:
NSURL *url = [NSURL fileURLWithPath:[path stringByExpandingTildeInPath]];
CFStringRef kind;
LSCopyKindStringForURL((CFURLRef)url, &kind);
return kind ? CFBridgingRelease(kind) : @"";
我用下面的方式获取实物
(NSURL *)path
NSString *tempKind;
[path getResourceValue:&tempKind forKey:NSURLLocalizedTypeDescriptionKey error:nil];
我正在使用以下代码在 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);
说:
C-style cast from 'NSString *__strong *' to 'CFStringRef *' (aka 'const __CFString **') casts away qualifiers
经过一些研究,我发现需要 __bridge
关键字才能使从 NSString* 到 CFStringRef* 的转换在 ARC 中有效。所以我坚持使用关键字,产生:
LSCopyKindStringForURL((CFURLRef)url, (__bridge CFStringRef*)&kind);
现在,我收到以下错误:
Incompatible types casting 'NSString *__strong *' to 'CFStringRef *' (aka 'const __CFString **') with a __bridge cast
它开始让我发疯了...无论我尝试什么,我就是无法让错误消失。有什么想法吗?
有一个简单的解决方法。使用实际的 CFStringRef
变量,并在需要 return 时将其转换为 NSString
:
NSURL *url = [NSURL fileURLWithPath:[path stringByExpandingTildeInPath]];
CFStringRef kind;
LSCopyKindStringForURL((CFURLRef)url, &kind);
return kind ? CFBridgingRelease(kind) : @"";
我用下面的方式获取实物
(NSURL *)path
NSString *tempKind;
[path getResourceValue:&tempKind forKey:NSURLLocalizedTypeDescriptionKey error:nil];