0

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

-(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
4

2 回答 2

4

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

系统框架将(理论上)+[UIImage imageNamed:]在内存警告出现时释放缓存的图像,但我从经验中知道内存警告不是互锁的——也就是说,在进程被杀死之前,您不一定有足够的时间来减少消耗。

从您发布的代码中:

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

这将防止它被准无限期地保存在系统缓存中。你的其余代码是否正确处理它,我不能说,但这将消除+[UIImage imageNamed:].

于 2013-08-01T13:44:50.073 回答
0

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

于 2014-01-08T19:13:19.600 回答