应用程序围绕UIImageView(内存泄漏)

时间:2013-08-01 13:04:58

标签: ios objective-c ipad

我的应用程序以处理动作激活的图像为中心。大多数应用程序将包含以下各种各样的变体,如下所示。

-(IBAction)tap{
    if(a == 0){
        a = 1;
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:(1.8)];
        [image setAlpha:1];
    }else if (a== 1){
        a = 0;
        [image setAlpha:0];
    }
     [UIView commitAnimations;
}

问题是由于我收到多个内存警告,我无法在iPad上运行此功能。面向活动的工具明确指出,当我的应用程序被访问时,“backboardd”使用287兆字节。一旦访问了最重的所有视图控制器,我的应用程序就会崩溃。我的问题是我将如何释放这些图像,直到绝对需要这些图像。请记住,使用面向ARC的方法时,严格禁止使用许多方法。我感谢任何通过回复这篇文章来帮助我的尝试。

更新:如果你看下面,那么你会看到能够加载图像的片段。

-(IBAction)thisisanaction{
    UIImage *letter = [UIImage imageNamed:@"HelloWorld.png"];
    [imageholder setImage:letter];

额外信息:

#   Address Category    Timestamp   Live    Size    Responsible Library Responsible Caller
2   0x4c4e000   VM: ImageIO_PNG_Data    00:02.263.286   •   128.59 MB   ImageIO ImageIO_Malloc

2 个答案:

答案 0 :(得分:4)

您是否使用+[UIImage imageNamed:]加载图片?如果是这样,那些图像将由系统框架缓存,直到出现内存警告。您可以尝试使用+[UIImage imageWithContentsOfFile:]以可以控制其生命周期的方式加载图像。

当出现内存警告时,系统框架将(理论上)释放通过+[UIImage imageNamed:]缓存的图像,但我从经验中知道内存警告没有互锁 - 即您没有足够的时间来减少你的过程被杀之前你的消费。

根据您发布的代码:

-(IBAction)thisisanaction{
    UIImage* letter = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"HelloWorld" ofType: @"png"]];
    [imageholder setImage:letter];

这将使其无法在系统缓存中被无限期地保留。我不能说代码的其余部分是否正确处理,但这将消除+[UIImage imageNamed:]的副作用。

答案 1 :(得分:0)

当使用+ [UIImage imageNamed:]来加载大量不同的图像时,我遇到了类似的内存问题,但ipmcc的使用+ [UIImage imageWithContentsOfFile:]的解决方案却解决了这个问题。非常感谢!