2011-07-14 21 views
1

私のコードは次のとおりです。なぜCFURLCreateStringByAddingPercentEscapesに潜在的にリークがありますか?

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

NSString *totalString = [NSString stringWithFormat:@"buffer/%@", buffer]; 

私は「ビルドとツールをanalize」走ったと見なかった:「オブジェクトは、ライン979上で割り当てられ、 『バッファ』内に保存され、もはやこの時点の後に参照され、+の保持カウントを持っています1(オブジェクトが漏れた) "

CFURLCreateStringByAddingPercentEscapesにはなぜリークがありますか?

答えて

1

を使われているリーク見ている場所を表示される場合があります。

Core Foundationの機能は、その名前を持つが返品されたオブジェクト を所有している場合は、

  • 名前に「作成」が埋め込まれたオブジェクト作成関数。
  • 名前に「コピー」が埋め込まれたオブジェクト複製機能。

オブジェクトを所有している場合は、終了した時点で(CFReleaseを使用して)所有権を放棄することは、あなたの責任です。

1

thisを見ると、メソッドとして割り当てられていることがわかります。Createが含まれていますが、文字列の所有権を放棄していません。

あなたが所有しているもので、あなたはbufferを所有している必要があります。追加、

[buffer release]; 

あなたがtotalStringを取得した後。

0

アナライザはあなたのケース979には、あなたの行にエラーが発生しますが、そのが参照オブジェクトがあなたのコードを見ることなく、それ

の上に実際には何が起こることができ、私は必ずしかし、最大読むことができません数行との誤差が実際にから来ているとXCodeのが唯一のそれはこれが原因で、「ルールの作成」である

0

CFURLCreateStringByddingPercentEscapesあなたはそれが漏れないようにするために、バッファ(またはautoreleaseの)を解放する必要があるので、使用して返された値のメモリ管理を転送する必要がありARCの下..

5

を+1の参照カウント数の文字列を作成します__bridge_transfer:

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

これはありがとうございます! – rick

関連する問題