42

Objective-CプログラムをObjective-CARCに変換すると、次のエラーが発生します。

"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];
}

ブリッジキャストとは何ですか?

エラーのスクリーンショット

4

3 に答える 3

57

LLVMWebサイトのARCドキュメントを参照してください。__bridgeまたは他のキーワードの1つを使用する必要があります。

これは、Core Foundationオブジェクト(CF * Refs)がARCによって制御されておらず、Obj-Cオブジェクトのみが制御されているためです。したがって、それらの間で変換するときは、オブジェクトを適切にクリーンアップできるように、オブジェクトの所有権についてARCに通知する必要があります。最も単純なケースは__bridgeキャストであり、ARCは追加の作業を行いません(オブジェクトのメモリを自分で処理することを前提としています)。

于 2011-07-17T17:52:25.153 に答える
19

これは、 @jtbandesが参照しているAppleのドキュメントよりも理解しやすいことがわかった素晴らしいARCチュートリアルです。

特に「フリーダイヤルブリッジング」というタイトルのセクションを見てください。

于 2011-10-02T04:15:29.193 に答える
4

私はこれが古いスレッドであることを知っています、私は使用する必要がある間にこの問題に遭遇しました

- (NSString *)URLEncodedString 
{
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                       (CFStringRef)self,
                                                                       NULL, CFSTR("!*'();:@&=+$,/?%#[]"),
                                                                       kCFStringEncodingUTF8);
[result autorelease];
return result;
}

だから私がしたことは、ターゲット>ビルドフェーズ>ソースのコンパイルに移動することです。リストされているファイルがあります。それをダブルクリックして、ファイルの横に次の行を追加します。

-fno-objc-arc
于 2016-09-06T13:19:25.100 に答える