Objective c 加载图像时的内存管理

Objective c 加载图像时的内存管理,objective-c,animation,memory-management,uiimageview,Objective C,Animation,Memory Management,Uiimageview,我有一个平移手势,可以平移一系列图像。我不确定如何正确管理内存,在平移一定时间后,我会崩溃 animImage是一个UIImageView 以下是它的工作原理: - (IBAction) panAnim:(UIPanGestureRecognizer *)sender{ CGPoint translate = [sender translationInView:sliderView]; if (translate.x >= lastPoint) { dif

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

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];
}
-(iAction)panAnim:(UIPangestureRecognitor*)发送方{
CGPoint translate=[sender translationView:sliderView];
如果(translate.x>=lastPoint){
差异=平移.x-最后一点;
[自我推进:差异];
}否则{
差异=最后一点-平移.x;
[自我落后:差异];
}
lastPoint=translate.x;
}
-(无效)前进动画:(CGFloat)速度{
NSInteger newFrame=当前帧+速度;
当前帧=新帧;
如果(当前帧>=总帧){
currentFrame=0;
}
NSString*newImagePath=[NSString stringWithFormat:@“%@,[currentAnimation objectAtIndex:currentFrame]];
animImage.image=[UIImage ImageName:newImagePath];
}
-(无效)后退动画:(CGFloat)速度{
NSInteger newFrame=当前帧速度;
当前帧=新帧;

如果(currentFrame
+[UIImageView ImageName:]
缓存它加载的图像,因此内存使用量不断增加也就不足为奇了。您可以尝试将这些
+imageNamed:
调用改为
+imageWithContentsOfFile:
。这可能会影响动画性能,但我怀疑您会看到内存使用量显著下降

内存警告并不意味着崩溃即将发生。如果您发布崩溃的详细信息,这会有所帮助。查看崩溃日志,您应该能够识别代码中导致崩溃的一行--可能是堆栈顶部的几帧。找到该行,在其前面放置一两行断点,然后逐步遍历代码调整每行上可能发生的可能导致问题的内容—分配失败、值错误等


顺便说一句,您的25kB图像文件可能会在内存中扩展为更大的文件。

animImage是UIImageView吗?乍一看,我没有发现您发布的代码有任何问题,只是currentAnimation可能存在索引问题。您是否得到堆栈跟踪?是的,animImage是UIImageView。如果此代码没有问题,那么可能是导致错误的原因坠机地点在别处,我会调查的。Cheers@j0k问题的原因是内存不足警告,然后崩溃-这是因为动画。我看不到代码中有任何问题-可能尝试在仪器下运行它以查看泄漏的内容?@Daniel-可能不相关,但值得检查,但您加载的图像有多大?这个工作正常。自从我使用它以来,我还没有让它崩溃。我不知道
imageNamed:
-谢谢!我会在它解锁时奖励它(21小时)很好,很高兴我能提供帮助。不过,请确保在内存不足的情况下进行彻底测试——即使内存不足,你的应用程序也不会崩溃。切换到
+imageWithContentsOfFile:
可能是一个有益的改变,但它也可能通过消除内存不足的情况来掩盖你真正的问题。目前,这是唯一的解决办法应用程序的非选择性(我还没有建立很多),所以我不确定它是否掩盖了一个问题-我认为这是目前唯一的问题。现在这个问题已经解决了,我可以继续建立它的剩余部分了!感谢你的帮助!@Daniel Hanly,我感谢你的赞赏。-)谢谢。