web-dev-qa-db-ja.com

Objective-Cポインター型「NSString *」からCポインター型「CFStringRef」(別名「const struct __CFString *」)へのキャストには、ブリッジキャストが必要です

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

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

Screenshot for error

40
Michael Rowe

LLVM Webサイトの ARC documentation をご覧ください。 __bridgeまたは他のキーワードのいずれかを使用する必要があります。

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

56
jtbandes

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

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

19
benvolioT

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

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

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

-fno-objc-arc
0
Nij