2

この質問に加えて、 BEncoding.mの一連のメモリ リークを修正しました(元はhereから) 。

明らかなメモリ リークはすべて修正しましたが、Clang は 4 つの「返されたオブジェクトのリーク」バグを発見しました。

完全なメッセージ/適切なコードは次のとおりです。

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] 所有参照として呼び出し元に返されるオブジェクト (呼び出し元に転送される単一保持カウント)

4

3 に答える 3

7

あなたがしたい:

[データの自動解放] を返します。

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

于 2009-04-28T17:19:18.673 に答える
3

わかりましたので、上記の回答を展開します(正しい軌道に乗せてくれてありがとう)...

return [data autorelease]

オブジェクト「データ」を割り当てて、このオブジェクトを呼び出し元に返そうとしています。これが Obj-C で機能する方法は、コール スタックのあるレベルで、NSAutoreleasePool があることです。「自動解放」メッセージをデータに送信すると、その自動解放プールに自身が追加されます。これにより、呼び出し元は明示的に「解放」を呼び出す必要なく、「データ」オブジェクトを短時間 (つまり、ローカル スタック フレームの期間中) 使用できます。最終的に、自動解放プールが「ポップ」すると、データの割り当てが解除されます (誰かが「保持」と呼んでいます)。それはかなり賢いです。

甘い。Obj-C メモリ管理の緑帯を獲得したばかりだと思います。

于 2012-06-24T04:24:25.123 に答える
1

オブジェクトが返される前に適切に自動解放されていないようです。これは、Objective-C のメモリ管理規則に違反しています。

于 2009-04-28T17:14:09.497 に答える