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 Webサイトの ARC documentation をご覧ください。 __bridge
または他のキーワードのいずれかを使用する必要があります。
これは、Core Foundationオブジェクト(CF * Ref)がARCによって制御されておらず、Obj-Cオブジェクトのみが制御されているためです。したがって、それらを変換するときは、ARCにオブジェクトの所有権を伝えて、適切にクリーンアップできるようにする必要があります。最も単純なケースは__bridge
キャストであり、ARCは追加の作業を行いません(オブジェクトのメモリを自分で処理することを想定しています)。
これは Nice ARCチュートリアル です。これは、@ jtbandesが参照するAppleのドキュメントよりも理解しやすいことがわかりました。
特に「フリーブリッジング」というタイトルのセクションをご覧ください。
私はこれが古いスレッドであることを知っています、私は使用する必要がある間にこの問題に遭遇しました
- (NSString *)URLEncodedString
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)self,
NULL, CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8);
[result autorelease];
return result;
}
だから私はターゲット>ビルドフェーズ>ソースのコンパイルに行きました。ファイルがリストされているので、それをダブルクリックして、ファイルの横に次の行を追加します。
-fno-objc-arc