1

画像を生成するためにかなりメモリを集中的に使用するループを実行していますが、メモリ リークが発生したり、メモリ割り当てを保持する自動解放が長すぎたりします。

以下で何が保持され、自動リリースされているかを正確に説明してもらえますか? これを Allocations インストゥルメントで実行したところ、ループが終了し、すべての autorelease オブジェクトの割り当てが解除されるまでサイズが大きくなります (3 日間の試行錯誤から理解できるように)。ループが少ない場合はこれで問題ありませんが、200 を超えると、自動解放される前に最終的にクラッシュします。次のコードをコメントアウトすると、この増加が止まり、Instruments グラフは一定量のメモリで水平に保たれます。

   for (int l=0;1 < 300; 1++) {
      UIImage * Img = [[UIImage alloc] initWithContentsOfFile:Path]; //Path is a NSString pointing to bundlePath and a sample image
      UIImageView *ImgCont = [[UIImageView alloc] initWithImage:Img];

      //here I usually add the view to a UIView but it is not required to see the problem
      ImgCont.frame = CGRectMake(x, y, w, h);

      [ImgCont release];
      [Img release];
   }

これを NSAutoreleasePool でラップしようとしましたが、成功しませんでした。何が間違っているのでしょうか?

ありがとう、

4

2 に答える 2

2

imageViewをビューに追加すると、そのビューによって保持されるため、ImgとImgContを解放しても、それらは引き続き存在し、300個のオブジェクトが残ります。

また、これについては完全にはわかりませんが、同じ画像を繰り返し使用する場合は、[UIImage imageNamed:NAME]を使用する必要があります。これは、画像を再利用するため、[UIImage initWithContentsOfFile:道]; (OSがその場合を最適化しない場合、現在、同じ画像が300回メモリにあります)。

于 2012-05-28T21:44:29.683 に答える
1

明示的に作成しているオブジェクトはいずれも自動リリースされていないため、UIKit呼び出し内のものである必要があります。自動リリースの数を減らすという点では、それについてできることは多くありません。しかし、あなたができることは、自動解放プールをいじることです。

あなたは試しNSAutoreleasePoolたと言いますが、ループの各反復を次のようにプールでラップしようとしましたか?

for (int l=0;1 < 300; 1++) {
    @autoreleasepool {
        UIImage * Img = [[UIImage alloc] initWithContentsOfFile:Path]; //Path is a NSString pointing to bundlePath and a sample image
        UIImageView *ImgCont = [[UIImageView alloc] initWithImage:Img];

        //here I usually add the view to a UIView but it is not required to see the problem
        ImgCont.frame = CGRectMake(x, y, w, h);

        [ImgCont release];
        [Img release];
    }

}

あなたはそれを正確にそのようにしないことを考えるべきですが、それはおそらくやり過ぎだからです。しかし、それを試してみることをお勧めします。それでも問題が解決しない場合は、このループではありません。

于 2012-05-28T21:39:06.343 に答える