1

我正在运行一个相当消耗内存的循环来生成图像,并且已经陷入内存泄漏/自动释放保留内存分配太久的问题。

任何人都可以准确解释下面持有和自动发布的内容吗?我已经通过 Allocations 工具运行了它,它的大小会增加,直到循环完成并释放所有自动释放对象(我从 3 天的反复试验中了解到)。这对于较少的循环是可以的,但是当我超过 200 时,它最终会在它自动释放之前崩溃。通过注释掉以下代码,这种增加停止并且仪器图表保持水平并具有一定的内存量:

   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:小路]; (如果操作系统没有优化这种情况,现在你在内存中拥有相同的图像 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 回答