0

サーバーからNSDataオブジェクトに一連の画像を次のように読み込んでいます。

for (int i = 0; i < 36; i++)
{
    NSURL *url = [NSURL URLWithString:@"http://12.34.56.78/image.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    // Further processing here
}

問題は、各データオブジェクトの半分がメモリに保持されていることです。これは、機器のリークとしては表示されません。画像に関係するすべてのものを削除し、コメントの前に2行しかないため、これがNSDataオブジェクトであることがわかります。同じ動作が発生します。明示的に初期化と解放を割り当ててみましたが、同じ結果になりました。

これを理解するのが非常に難しいのは、この動作を再現するために2番目のプロジェクトを作成したのですが、それを実現できないことです。他のプロジェクトでは、このコードは期待どおりに機能します。だから私は尋ねています、何がそのような行動を引き起こすのでしょうか?非常に明白な何かを見落としているような気がします。

4

3 に答える 3

0

表示されているものが着実にメモリを増やしている場合は、InstrumentsのObject Allocationsプローブを使用して、実際にメモリを保持しているものを探します。「リーク」ではない方法でメモリを浪費する方法はたくさんあります。サイズがNSDataサイズの半分であるという事実は、間違った場所を探していることを示しています。オブジェクトの半分を解放している可能性はほとんどありません。

于 2009-08-18T16:18:46.237 に答える
0

AppDelegateに配列があり、単一の行への参照を取得してから(誤って)オブジェクトのハンドルを解放した場合に、同様の問題が発生しました。その結果、3回の呼び出しの後、問題の行のオブジェクトはすべてのプロパティでnil値を持ちましたが、それ自体はnilではありませんでした。それを理解するのに約1週間かかりました。今日まで、問題に気付くまでにリリースに3回の呼び出しが必要だった理由はまだわかりません。1週間後、1行のコードが20時間ほどの無駄な時間の原因であることに気付いたとき、私の欲求不満を想像できると思います。;)

于 2009-08-18T16:10:07.063 に答える
0

あなたが書いた2行から、そのデータオブジェクトは、データオブジェクトが自動解放する必要がある範囲外に出たときに、保持していないため、決してリークすることはありません.だから、あなたが投稿した2行から本当にわかりません..

于 2009-08-18T16:04:09.277 に答える