2009-04-28 8 views
2

さらにthis questionに私はすべての明白なメモリリークを修正しましたが、クランは、4つの「リーク返されたオブジェクトの」バグを発見した、どのI(もともとhereから)BEncoding.mClangの "返されたオブジェクトのリーク"は何を意味しますか?

をメモリリークの束を修正しました[ソートする方法分からない:

完全なメッセージ/コードの適切なビットがある:

NSMutableData *data = [[NSMutableData alloc] init]; 

[1]メソッド+1とObjective-Cのオブジェクトを返す参照を所有する(カウント値を保持します)

[...] 
snprintf(buffer, 32, "%lu:", [object length]); 
[data appendBytes:buffer length:strlen(buffer)]; 
[data appendData:object]; 
return data; 

オブジェクトは、(単一呼び出し側に転送回数を保持)所有リファレンスとして呼び出し元に返さ[3]

それは、彼らが戻っている前に、適切に自動解放されていないオブジェクト、のように聞こえる

答えて

3

OKは、そう

return [data autorelease] 

...(右のトラックに私を設定するためのおかげで)上記の解答を拡大するあなたは、いくつかのオブジェクト、「データ」を割り当てられている、と戻って、このオブジェクトを返しますしようとしています呼び出し元に。これがObj-Cで動作する方法は、コールスタックのあるレベルでNSAutoreleasePoolが存在することです。 「autorelease」メッセージをデータに送信すると、その自動解放プールに自身が追加されます。これにより、呼び出し側は明示的に「解放」を呼び出す必要なく、短期間(つまりローカルスタックフレームの期間にわたって)「データ」オブジェクトを使用することができ、最終的に自動解放プールがポップするとデータは解放されません誰かが「保持」と呼ぶ)。それはむしろ賢いです。

甘味。私はObj-Cのメモリ管理で自分のグリーンベルトを獲得したと思う。

7

が希望:

リターン[データ自動リリース];

あなたが発信者にそれを渡しているからです。

+0

+1。あなたの答えを広げてください。これは非常に暗いと混乱の話題であり、この小さなブレッドクラムの知識はほとんど私が –

関連する問題