![](/img/trans.png)
[英]Incompatible pointer types sending 'const CFStringRef' (aka 'const struct __CFString *const') to parameter of type 'id'
[英]cast of Objective-C pointer type 'NSString *' to C pointer type 'CFStringRef' (aka 'const struct __CFString *') requires a bridged cast
将 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
cast,ARC 不会为此做任何额外的工作(它假设您自己处理对象的 memory)。
这是一个很好的 ARC 教程,我发现它比 @jtbandes 引用的 Apple 文档更容易理解。
请特别查看标题为“免费桥接”的部分。
我知道这是一个旧线程,我在需要使用时遇到了这个问题
- (NSString *)URLEncodedString
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)self,
NULL, CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8);
[result autorelease];
return result;
}
所以我所做的是 go 到Target > Build phase > Compile sources 。 列出了您的文件,双击该文件并在文件旁边添加以下行。
-fno-objc-arc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.