将Objective-C指针types'NSString *'转换为C指针types'CFStringRef'(又名'const struct __CFString *')需要一个桥接转换
将Objective-C程序转换为Objective-C ARC时,出现以下错误:
"cast of Objective-C pointer type 'NSString *' to C pointer type 'CFStringRef' (aka 'const struct __CFString *') requires a bridged cast "
代码如下:
- (NSString *)_encodeString:(NSString *)string { NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)string, // this is line in error NULL, (CFStringRef)@";/?:@&=$+{}<>,", kCFStringEncodingUTF8); return [result autorelease]; }
什么是桥接演员?
查看LLVM网站上的ARC文档 。 您必须使用__bridge
或其他关键字之一。
这是因为Core Foundation对象(CF * Refs)不受ARC控制,只有Obj-C对象。 所以当你在它们之间进行转换的时候,你必须告诉ARC有关对象的所有权,以便它可以正确地清理它们。 最简单的情况是__bridge
,ARC不会做任何额外的工作(它假定你自己处理对象的内存)。
这里是一个很好的ARC教程 ,我发现比@jtbandes引用的Apple文档更容易理解。
请参阅标题为“免费桥接”的部分。
我知道这是一个古老的线程,我遇到这个问题,而我需要使用
- (NSString *)URLEncodedString { NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8); [result autorelease]; return result; }
所以我做的是去目标>build设阶段>编译源 。 列出您的文件,双击该文件并在文件旁边添加以下行。
-fno-objc-arc