2012-01-20 8 views
0

私はJSONをアプリで実装するためにJSONを使用しています。私は自分のコードをARCフレンドリーにしています。私はこのようなラインを作るときしかし、1ARC用のJSONの変更

CFStringAppendCharacters((CFMutableStringRef)json, &uc, 1); 

は私のアプリは、もはや私は、ユーザーがFacebookのにログインすることができます(私のフォトアルバムを引くことが可能である

CFStringAppendCharacters((__bridge CFMutableStringRef)json, &uc, 1); 

になっていないし、私は、彼を表示します彼/彼女は写真を後でアプリで使うためにアルバムを注文します)。

これは、ARCには理解されていないコード全体である - (誰が私にそれをしてください橋渡しする方法のヒントを与えることができる?)

NSString* escaped_value = (NSString *)CFURLCreateStringByAddingPercentEscapes(
           NULL, /* allocator */ 
           (CFStringRef)value, 
           NULL, /* charactersToLeaveUnescaped */ 
           (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
           kCFStringEncodingUTF8); 

誰がどのように私はポートARC用のJSONフレームワークを可能性を知っています?

+0

どのJSONフレームワークですか?なぜARCからこのコードを除外しないのですか? –

+1

ARCに行くなら、なぜNSJSONSerializationを使用しないのですか?あなたが失うのはわずか4.3のサポートです。 – Tommy

+0

ARCから除外しようとしましたが、Facebook APIがクラッシュしました。 NSJSONSerializationを使用する場合は、自分で解析する必要がありますか、それとも既にすべてですか?私はすでに持っている機能を書き換えることを必ずしも望まないでしょう。 NSJSONSerializationはどのように機能しますか? –

答えて

0

あなたのコメントでは、ちょうどNSJSONSerializationと一緒に行くことに決めましたが、それは間違いなく機能します。しかし実際にあなたの質問に答える。

__bridgeを使用すると、関連するメモリ管理について考えるときに簡単です。 __bridgeはあなたのためのメモリ管理操作を行わずにキャストします。 __bridge_transferもキャストされますが、キャストされるオブジェクトの保持カウントがデクリメントされます。だから、このことを念頭に置いて、あなたの関数呼び出しはそうのように分けることができます。

CFStringRef originalValue = (__bridge CFStringRef)value;// Only __bridge required because ownership not changing 
CFStringRef escapeChars = (CFStringRef)@"!*'();:@&=+$,/?%#[]";// __bridge not required for string literal 
CFStringRef escaped_CFString = CFURLCreateStringByAddingPercentEscapes(NULL, originalValue, NULL, escapeChars, kCFStringEncodingUTF8);// returns a CFStringRef that YOU own. 
NSString *escaped_value = (__bridge_transfer NSString *)escaped_CFString; // __bridge_transfer tells the compiler to send a release call to escaped_CFString. 

は今、あなたは何が起こっているか見ることをあなたが安全に、このような呼び出しを積み重ねることができます。

NSString* escaped_value = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(__bridge CFStringRef)value,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8); 

(注)この方法であることそれでも信頼できるものではありません。より完全な解決策はDave DeLong's answer to this questionにあります。