释放UIImageView的正确方法

时间:2011-01-04 20:29:15

标签: iphone objective-c memory-management

在询问有关仪器的问题并发现我的代码出现问题后,有两个问题:

第一:为什么上面的代码在分配工具中完全符合我的要求?(分配的内存小于30 Mb)

NSMutableArray* arrayOfImages = [[NSMutableArray alloc]initWithCapacity:30];
for (int i = 0; i <= 30; i++){
    NSString* path = [[NSBundle mainBundle]pathForResource:[NSString stringWithFormat:@"picture%d",i] ofType:@"png"];
    UIImage* img = [[UIImage alloc]initWithContentsOfFile:path];
    [arrayOfImages addObject:img];
    [img release];
}
imageView.animationImages = arrayOfImages;
[arrayOfImages release];
....
imageView.animationImages = nil;
[imageView release];

但事实上,分配的内存更多。

根据开发人员文档(内存管理),我认为我做的一切都是正确的,但是在设备程序中,由于内存不足,通常会​​崩溃。当然,这不是完整的代码,但这里的问题是定义的。(在应用程序中有5个带动画的UIImageViews,所有这些都使用了太多的内存。)

编辑好的,是否有可能解决此类问题。使用UIImages存在内存问题?

3 个答案:

答案 0 :(得分:1)

内存管理似乎没问题。

你确定你有0 ... 30的图像,总共31个,而不是代码在数组分配中建议的30个。

至于尺寸,31张图片需要320 * 480 * 4 * 31 = 19046400字节,最少需要18 MB。

编辑:如果你有5个,我们可能会说80多MB!

答案 1 :(得分:1)

您可以尝试在NSAutoreleasePool函数中打包for {}。通过创建一个巨大的86000大小的对象数组,我有同样的内存问题。我不知道为什么它有时不释放它应该。

答案 2 :(得分:0)

您正在创建31个NSImages。如果你的包中不存在picture0.png或picture30.png,你可能会遇到问题。

尝试使用i + = 5或i + = 10来查看是否能解决问题。

相关问题