2012-05-28 61 views
1

我正在运行一个相当内存密集的循环来生成图像,并在内存泄漏/自动释放内存分配时间过长。UIImageView泄漏/自动释放

任何人都可以请解释下面正在举行和autoreleased什么?我已经通过Allocations工具运行了它,并且它的大小增加,直到循环结束并释放所有autorelease对象(正如我从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包装这一点 - 任何想法我做错了吗?

感谢,

回答

1

无在明确创建被自动释放的对象,因此它必须是内部那些UIKit的电话你有东西。尽管减少autoreleases的数量,但你可以做的并不多。但是你可以做的是乱用autorelease池。

你说你已经尝试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]; 
    } 

}

虽然你应该想想不这样做是完全一样,因为它可能是过度杀伤。但我建议你尝试一下,如果你仍然有问题,那么这不是这个循环。

+0

这就是我的想法。一直以来,我一直在努力让自己精神沮丧,现在自下而上去看看记忆在哪里。那么是否有一些乐器只是玩弄技巧?这里是包含上述代码的仪器分配:http://i49.tinypic.com/296dhsg.jpg这里是上述代码被删除的代码:http://i48.tinypic.com/296n7lt。 PNG – Ralphonzo

+0

那么包装循环的内部部分在autorelease池中没有帮助? – mattjgalloway

+0

不幸的不是。似乎略有改善,但仍在缓慢增加,一旦循环完成,就会从第一个链接中看到回落。这是什么让我觉得这是一个Autorelease,但评论似乎指向别处 – Ralphonzo

2

将imageView添加到视图时,它被该视图保留,所以即使您释放Img和ImgCont,它们仍然存在,并且您剩下300个对象。

此外,我不完全确定这一点,但如果你反复使用相同的图像,你应该使用[UIImage imageNamed:NAME],因为它重用图像,我不能说[UIImage initWithContentsOfFile:PATH]; (如果操作系统不优化这种情况,现在你在内存中有相同的图像300次)。

+0

这很有道理。是否有可能强制释放UIImageView中的图像,而不是等待autorelease?假定它不像[UIImageView.Image release]那么简单?随着你的第二条评论,我在这个例子中使用相同的图像,试图追踪它没有被释放的地方,因为我有一个单独的函数返回完整应用程序中的图像。将代码更改为imageNamed可以改善它,但它仍然在缓慢增加。 – Ralphonzo

+1

您的代码中没有任何图像正在自动发布,因此我不确定您的意思。问题是,如果你想使用一个对象,它必须在内存中,所以如果你设法在imageView中释放图像,你的应用程序将崩溃。保持低性能和低内存的方法是跳过UIImageView并编写自己的覆盖drawRect的UIView子类,并多次绘制相同的图像。 – EmilioPelaez

+0

我知道,它让我困惑了大约一周。根据我给予亚光的链接,我附上的确切代码包括肯定会在循环结束时发布的东西。如果我将此代码注释掉,那很好,不会增加。我喜欢你的建议。你有链接或方向,所以我可以进一步调查? – Ralphonzo