【问题标题】:iOS - UIImageView animation memory leak?iOS - UIImageView 动画内存泄漏?
【发布时间】:2013-03-16 03:54:36
【问题描述】:

我目前正在使用UIImageView 根据用户按下的按钮为一系列图像设置动画。我在NSArrays 中创建了大约 5 组不同的图像,例如:

-(void)initiateAnimations {

punchani = [NSArray arrayWithObjects:
           [UIImage imageNamed:@"punch0001.png"],
           [UIImage imageNamed:@"punch0002.png"],
           [UIImage imageNamed:@"punch0003.png"],
           [UIImage imageNamed:@"punch0004.png"],
           [UIImage imageNamed:@"punch0005.png"],
           [UIImage imageNamed:@"punch0006.png"],
           [UIImage imageNamed:@"punch0007.png"],
           [UIImage imageNamed:@"punch0008.png"],
           [UIImage imageNamed:@"punch0009.png"],
           [UIImage imageNamed:@"punch0010.png"],
           [UIImage imageNamed:@"punch0011.png"],
           [UIImage imageNamed:@"punch0012.png"],nil];
}

然后我使用标准动画代码将它们循环一次:

player.animationImages = punchani;
player.animationDuration = 0.50;
player.animationRepeatCount = 1;
[player startAnimating];

但是,当我将越来越多/不同的图像加载到 UIImageView 中时,我最终会得到一个内存警告的输出,如下所示:(用“appname”替换我的实际可执行文件)

 2013-03-15 20:52:23.065 AppName[2080:907] Received memory warning.

我知道这可能会发生,但 ARC 禁止我释放这些数组。我该如何解决这个泄漏?谢谢

【问题讨论】:

  • 请注意,当在 UIImageView 中使用时,每个图像都会完全展开到内存中。要计算每张图像所需的内存,请将宽度乘以高度乘以 4 (RGB+A)。
  • 顺便说一下,您不需要像这样显式设置一个数组,因为您的图像命名良好,您可以使用animatedImageNamed:duration: 方法,我假设它是按需加载图像而不是一下子。

标签: iphone ios animation memory uiimageview


【解决方案1】:

UIImage imageNamed:缓存图片并按照自己的时间表释放内存。利用 + (UIImage *)imageWithContentsOfFile:(NSString *)path直接加载内存

Try this answer as well.动画结束时删除图片数组

【讨论】:

  • 谢谢。我讨厌问这个,但我将如何使用它?我正在努力寻找如何应用它......
  • [NSArray arrayWithObjects:[UIImage imageWithContentsOfFile:yourBundlePath],....., nil];
  • 太好了,我会试一试的。谢谢!
  • 只是为了扩展@DivineDesert 的分析器,[UIImage imageNamed: ] 使用手机的缓存来存储图像。你无法控制 iOS 何时释放缓存,如果你只需要在内存中加载一次图像,[UIImage imageWithContentsOfFile:] 更有意义,不需要时会立即释放。
  • 我尝试创建类似NSMutableArray *arrAnimatedImages = [[NSMutableArray alloc]init];for (int i = 0; i<directoryItems.count; i++) { [arrAnimatedImages addObject:[UIImage imageWithContentsOfFile:yourBundlePath(i)]]; } 的 nsmutablearray 但应用​​程序崩溃原因:'*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil' 请帮助我如何创建 NSMutableArray @DivineDesert
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多