我有一个平移手势,平移一系列图像。我不确定如何正确管理内存,在平移一段时间后,我正在崩溃。
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
答案 0 :(得分:1)
+[UIImageView imageNamed:]
缓存它加载的图像,因此您的内存使用量不断增加也就不足为奇了。您可以尝试将这些+imageNamed:
来电更改为+imageWithContentsOfFile:
。这可能会损害您的动画效果,但我怀疑您会看到内存使用率大幅下降。
内存警告并不意味着即将发生崩溃。如果您发布崩溃的详细信息,它会有所帮助。查看崩溃日志,您应该能够在代码中识别导致崩溃的一行 - 它可能距离堆栈顶部几帧。找到那一行,在它之前放置一两行断点,并逐步完成代码,想象可能导致问题的每一行可能发生的事情 - 分配失败,价值不好等。
BTW,你的25kB图像文件可能会扩展到更大的内存。