2012-05-11 6 views
0

は、ここでメモリリークがあると考えて保持して、誰もがこれで間違って何も見えませんか?私はこのコードを書いていないので、Cの呼び出しに慣れていません。 docsからコールは、私はARCとXcodeに私のプロジェクトを変換していたカウント

- (NSString*) URLEscaped 
{ 

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

    return encodedString; 

} 

答えて

1

あなたはCore Foundationのオブジェクトを使用して への参照を取得することができる多くの方法があります。 Core Foundationの所有権 方針に沿って、あなたはあなたがメモリ 管理に関して取るべきアクションを知っているように、 関数によって返されたオブジェクトを所有しているか否かを知る必要があります。 Core Foundationのは、あなたが関数によって返さ オブジェクトを所有しているか否かを判断することができます その機能の命名規則を確立しています。簡単に言えば、関数名に という単語「作成」または「コピー」が含まれている場合は、そのオブジェクトを所有しています。関数名 に "Get"という単語が含まれている場合は、そのオブジェクトを所有していません。

はい、そこにはCFStringがリークしています。 ARCの下

+0

だから私はその後、ここに自動解放を使用しても大丈夫ですか? – TheLearner

+1

はい、返されたオブジェクトの 'autorelease'はうまくいくはずです。 – mit3z

+2

ARCで '-autorelease'を使うことができないことを除けば、ARCはそのキャストを好まないでしょう。 'encodedString'を' NSString * 'の代わりに' CFStringRef'として宣言し、 'return CFBridgingRelease(encodedString);'を実行する必要があります。ブリッジリリースは、オブジェクトの所有権をARCに渡しながら、Core Foundationの "Create"のバランスをとります。 –

4

あなたはARCに返される文字列のメモリ管理を転送する__bridge_transfer使用することができます。

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