内存泄漏,iPad上有很多大图像

时间:2011-11-22 15:32:26

标签: ios ipad memory-management memory-leaks nsarray

我正在尝试将 UIImage 数据存储在 NSArray 中,实际上是60张图片,每张图片大小为300kb。然后,我试图在 UIImageView 中为这些图像制作动画。

我的代码:

    NSMutableArray *arr = [[NSMutableArray alloc] init];
    for (int i=0; i<61; ++i) {
        [arr addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%i.png", i]]];
    }

    img.animationImages = arr;
    img.animationDuration = 1.5;
    img.contentMode = UIViewContentModeBottomLeft;
    [img startAnimating];


当我在iPad模拟器4.3中测试它时,它工作正常 当我想在我的设备(iPad 1)上测试它时,应用程序崩溃

注意:如果我对此代码发表评论,应用不会崩溃: [img startAnimating];

1。可能是什么问题呢?我认为这是记忆问题......?! 2.我可以在NSArray中存储一些UIImages吗?

3 个答案:

答案 0 :(得分:4)

您的png文件可能有300KB,但这是一种压缩格式。

要了解图像本身的大小,您应该将每个像素的宽度,高度和字节相乘。

即。如果图像的大小为1024 * 1024和RGBA模型,则图像本身在内存中的大小为4MB。这只是一张图片。如果你有300,它大概是120MB。

注意:这只是一个粗略的经验法则,但它会给你一个想法。

因此,您应该在数组中保留路径名并仅在需要时加载图像,并且应缩小缩略图并将其作为文件存储在磁盘上。不要只缩放UIImageView。

以下是a great article,其中包含有关调整大小的代码。

答案 1 :(得分:1)

我用另一种方式解决了应用程序崩溃问题:我尝试使用简单的 NSTimer 。对于每次迭代,我将第n个图像设置为 UIImageView

  • 我在xib文件中有 UIImageView ,指向 img 变量。
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:.03 
                            target:self 
                            selector:@selector(tiktak) 
                            userInfo:nil repeats:YES];
int n = 0;

-(void)tiktak {
    n++;
    img.image = [UIImage imageNamed:
                   [NSString stringWithFormat:@"Blue Menu_%i.png", n]];
    if(nn == 60) nn = 0;
}


动画很神奇。我还在Activity Monitor中对它进行了测试,CPU使用率为6%甚至更低。

答案 2 :(得分:0)

我不建议你在NSArray中存储许多UIImages,它的方式过于沉重和低效。这些图像来自哪里(捆绑,互联网,设备的图库)?

编辑:我不知道你想要它看起来如何,但你可以使用UIImages的名称构建数组,然后加载UIImage并显示它。像这样:

for(i=0;i<60;i++){
 NSString *nameOfPicture=[NSString stringWithFormat:@"picture_%d",i+1]
 [array addObject:nameOfPicture];
}