我的动画JPG不会发布

时间:2014-02-17 00:24:05

标签: ios animation memory uiimage

我一直在通过Instruments(Allocator)运行我的应用程序,检查我的应用程序的内存使用情况。当我退出页面时,大多数应用程序释放内存,但是在某些使用动画的页面上使用:

-(IBAction)start:(id)sender
{
    animation.animationImages = [NSArray arrayWithObjects:
                                 [UIImage imageNamed:@"Paddle 1.jpg"],
                                 [UIImage imageNamed:@"Paddle 2.jpg"],
                                 [UIImage imageNamed:@"Paddle 3.jpg"],
                                 [UIImage imageNamed:@"Paddle 4.jpg"],nil];
    [animation setAnimationRepeatCount:0];
    animation.animationDuration = 2.5;
    [animation startAnimating];
}

内存跳转到大约45MB的使用率(每个jpgs为330kb),当我退出页面时没有释放。

我阅读并发现当故事板变深时ARC并不总是有效,所以我理解这些页面(MainView> Container> UITableView> UITabView> UIImage)很可能是问题所在。

当我退出应用程序时,内存会回落到9MB并释放图像,但是当我退出视图时是否应该释放图像?该应用程序从未在我身上崩溃或者说存在内存问题,我只是不希望这是Apple拒绝该应用程序的原因。

这是打开动画时应用程序打开时的内存使用量(低点)(最重要的一步)

enter image description here

此问题是图片仅在退出应用时才会释放吗?如果是这样,当我改变视图时ARC没有自动释放图像,我需要做什么?

1 个答案:

答案 0 :(得分:0)

尝试更改每个

[UIImage imageNamed:@"Paddle 1.jpg"]

[UIImage imageWithContentsOfFile: GetImgWithoutCaching(@"Paddle 1.jpg")]

并添加功能

UIImage* GetImgWithoutCaching(NSString* imgName)
{
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:imgName ofType:nil];
    return [UIImage imageWithContentsOfFile:imagePath];
}

因为imageNamed会进行一些缓存,而imageWithContentsOfFile则不会。

最终代码应如下所示:

UIImage* GetImgWithoutCaching(NSString* imgName)
{
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:imgName ofType:nil];
    return [UIImage imageWithContentsOfFile:imagePath];
}

-(IBAction)start:(id)sender
{
    animation.animationImages = [NSArray arrayWithObjects:
                                 GetImgWithoutCaching(@"Paddle 1.jpg"),
                                 GetImgWithoutCaching(@"Paddle 2.jpg"),
                                 GetImgWithoutCaching(@"Paddle 3.jpg"),
                                 GetImgWithoutCaching(@"Paddle 4.jpg"),nil];
    [animation setAnimationRepeatCount:0];
    animation.animationDuration = 2.5;
    [animation startAnimating];
}