将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];
}
什么是桥接演员?
答案 0 :(得分:56)
查看LLVM网站上的ARC documentation。您必须使用__bridge
或其中一个关键字。
这是因为Core Foundation对象(CF * Refs)不受ARC控制,只有Obj-C对象。因此,当您在它们之间进行转换时,您必须告诉ARC有关对象的所有权,以便它可以正确地清理它们。最简单的情况是__bridge
强制转换,ARC不会做任何额外的工作(假设你自己处理对象的记忆)。
答案 1 :(得分:19)
我发现a nice ARC tutorial比@jtbandes引用的Apple文档更容易理解。
请特别注意标题为“免费桥接”的部分。
答案 2 :(得分:0)
我知道这是一个老线程,我在使用
时遇到了这个问题- (NSString *)URLEncodedString
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)self,
NULL, CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8);
[result autorelease];
return result;
}
所以我做的是去目标&gt;构建阶段&gt;编译来源。 列出了您的文件,双击它并在文件旁边添加以下行。
-fno-objc-arc