簡體   English   中英

Objective-C 指針類型“NSString *”到 C 指針類型“CFStringRef”(又名“const struct __CFString *”)的轉換需要橋接轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM