2011-06-13 67 views
0

我有一个平移手势,可以在一系列图像上平移。我不知道如何正确地管理这个内存,经过一段时间的平移之后,我得到了崩溃。加载图像中的内存管理

animImage是一个UIImageView;

这里是它如何工作的:

- (IBAction) panAnim:(UIPanGestureRecognizer *)sender{ 
    CGPoint translate = [sender translationInView:sliderView]; 

    if (translate.x >= lastPoint) { 
     difference = translate.x - lastPoint; 
     [self forwardAnim:difference]; 
    } else { 
     difference = lastPoint - translate.x; 
     [self backwardAnim:difference]; 
    } 
    lastPoint = translate.x; 
} 

-(void)forwardAnim:(CGFloat)speed{ 
    NSInteger newFrame = currentFrame+speed; 
    currentFrame = newFrame; 
    if (currentFrame>=totalFrames) { 
     currentFrame=0; 
    } 
    NSString *newImagePath = [NSString stringWithFormat:@"%@", [currentAnimation objectAtIndex:currentFrame]]; 
    animImage.image = [UIImage imageNamed:newImagePath]; 
} 

-(void)backwardAnim:(CGFloat)speed{ 
    NSInteger newFrame = currentFrame-speed; 
    currentFrame = newFrame; 
    if (currentFrame<0) { 
     currentFrame=(totalFrames-1); 
    } 
    NSString *newImagePath = [NSString stringWithFormat:@"%@", [currentAnimation objectAtIndex:currentFrame]]; 
    animImage.image = [UIImage imageNamed:newImagePath]; 
} 

动画检测的转换位置,并计算出什么“框架”的动画应该是,然后换出的图像。

我得到了一个非常流畅的动画,但很明显我导致崩溃,因为我没有正确管理内存。我收到内存警告,然后崩溃 - 但只有当我滚动浏览图像一段时间。

我需要找出预先加载100张图像的方法,所以我只能保留100张图像的内存。这很奇怪,因为图像在仪器IO输出中正确打开和关闭。

感谢您的帮助!

干杯,d

+1

animImage是一个UIImageView吗?乍一看,我没有看到你发布的代码有什么问题,而不是currentAnimation的索引问题。你有堆栈跟踪吗? – csano 2011-06-13 17:10:34

+0

是的animImage是一个UIImageView。如果这段代码很好,那么崩溃的原因可能就在别处。我会调查。干杯 – 2011-06-14 07:36:37

+0

@ j0k问题的原因是内存不足警告,然后崩溃 - 这是因为动画。 – 2011-06-14 16:28:10

回答

1

+[UIImageView imageNamed:]缓存图像加载,所以这并不奇怪,您的内存使用量不断增加。您可以尝试将这些+imageNamed:调用改为改为+imageWithContentsOfFile:。这可能会伤害您的动画表现,但我怀疑您会看到内存使用量显着下降。

内存警告并不意味着即将发生崩溃。如果你发布了崩溃的细节,它会有所帮助。查看崩溃日志,您应该能够识别导致崩溃的代码中的一行 - 它可能距栈顶几帧。找到该行,在它之前放置一两个断点,然后逐步浏览代码,想象每行可能发生的问题 - 分配失败,错误值等。

顺便说一句,你的25kB图像文件可能扩展到内存中更大的内容。

+0

这个工程。自从我使用这个以来,我没有遇到它。我没有意识到'imageNamed:'的缓存 - 谢谢!我会在解锁时奖赏赏金(21小时) – 2011-06-27 12:21:08

+0

太棒了,很高兴我能帮上忙。尽管如此,请确保在低内存条件下进行彻底测试 - 即使内存不足,应用程序也不应该崩溃。切换到'+ imageWithContentsOfFile:'可能是一个有益的改变,但它也可能通过消除内存不足的情况来掩盖真正的问题。 – Caleb 2011-06-27 12:55:43

+0

,因为它是应用程序中唯一的功能(我还没有建立它的很多功能),所以我不确定它是否掩盖了一个问题 - 我认为这是目前唯一的问题。现在这个问题已经修复,我可以继续构建其余的部分 – 2011-06-27 13:46:36