![](/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.