将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