加载图像中的内存管理

时间:2011-06-13 17:02:53

标签: objective-c animation memory-management uiimageview

我有一个平移手势,平移一系列图像。我不确定如何正确管理内存,在平移一段时间后,我正在崩溃。

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 个答案:

答案 0 :(得分:1)

+[UIImageView imageNamed:]缓存它加载的图像,因此您的内存使用量不断增加也就不足为奇了。您可以尝试将这些+imageNamed:来电更改为+imageWithContentsOfFile:。这可能会损害您的动画效果,但我怀疑您会看到内存使用率大幅下降。

内存警告并不意味着即将发生崩溃。如果您发布崩溃的详细信息,它会有所帮助。查看崩溃日志,您应该能够在代码中识别导致崩溃的一行 - 它可能距离堆栈顶部几帧。找到那一行,在它之前放置一两行断点,并逐步完成代码,想象可能导致问题的每一行可能发生的事情 - 分配失败,价值不好等。

BTW,你的25kB图像文件可能会扩展到更大的内存。