【问题标题】:Animation Using To Much Memory iOS7动画使用过多内存 iOS7
【发布时间】:2013-09-14 01:53:44
【问题描述】:

我将一系列 .png 图像加载到动画中,效果很好,但是当我切换到另一个视图时,动画使用的内存没有释放。每次返回该视图时都会占用越来越多的内存,直到最终应用程序由于内存压力太大而退出。

当视图改变时,有什么我可以放入视图 diddisappear 或其他方法来从动画中释放此内存吗?

这似乎只发生在我的 4S 运行 iOs 7 上。在我的 4S 上运行 6.1.2 它运行顺利。

NSArray *animationArray = [NSArray arrayWithObjects:
                               [UIImage imageNamed:@"0001.png"],
                               [UIImage imageNamed:@"0002.png"],
                               [UIImage imageNamed:@"0003.png"],

...

                               nil];
    self->tapanimation1.animationImages =animationArray;
    self->tapanimation1.animationDuration = .5;
    self->tapanimation1.animationRepeatCount = 1;
    [self->tapanimation1 startAnimating];

【问题讨论】:

  • 好的,我编辑了它以显示动画的代码
  • imageNamed 缓存图像(尽管它们是在内存压力下释放的,所以如果您由于内存不足而崩溃,那么缓存不是问题)。但是imageWithContentsOfFile 可以将缓存问题排除在循环之外,因此您可以确认这是否是问题所在。但我怀疑一定是发生了其他事情。
  • 该应用在没有动画的情况下运行良好。我正在为 iOS 7 更新它,并想为它添加更多闪光,但这些动画妨碍了它的运作,所以我不认为它是别的东西。

标签: ios animation memory crash


【解决方案1】:

如何在动画中分配图像 --- 有两种初始化 UIImage 的方法

首先是-->

[UIImage imageNamed:@"kshitij.png"];

这种方法存在问题,它不会释放内存,即使在释放时也是如此。

其次是-->

如果图像在您的应用程序包中,则始终使用此

 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"kshitij" ofType:@"png"];
 UIImage *image = [[UIImage alloc]initWithContentsOfFile:filePath];

现在使用这张图片并发布它,它肯定会为你节省一些 MB。 并且您还可以使用 ARC 来节省内存。

试试这个代码 --

NSSMutableArray *imageNameArray = [[NSSMutableArray
alloc]initWithObjects:@"0001",@"0002",nil];

NSMutableArray *imageArray = [[NSMutableArray alloc] init];

for(int i=0;i<imageNameArray.count;i++)
{
   NSString *filePath = [[NSBundle mainBundle]pathForResource:[imageNameArray
   objectAtIndex:i] ofType:@"png"]; 
   UIImage *image = [[UIImage alloc]initWithContentsOfFile:filePath];

   [imageArray addObject:image];
}

self->tapanimation1.animationImages = imageArray;
self->tapanimation1.animationDuration = .5;
self->tapanimation1.animationRepeatCount = 1;
[self->tapanimation1 startAnimating];

现在,当动画停止时,只需释放数组。如果您使用的是 ARC,则将其设为 nil。

【讨论】:

  • 我不完全理解第二个示例中发生了什么。我正在使用 ARC,当我尝试使用它时,它给了我 ARC 语义问题。
  • 好吧,我一定不知道自己在做什么,但我不知道如何正确使用该代码。请参阅我编辑的帖子以获取屏幕截图。
  • @Rob 知道了。谢谢!我现在正在努力,但我认为这是我需要的。
【解决方案2】:

你是如何导航到你的新视图控制器的,你又是如何返回的?你在使用 unwind segue 吗?您是否将新的视图控制器呈现为模态,然后将其关闭?

或者你是使用一个 segue 链接到第二个 VC,然后另一个 segue 链接回来?如果您使用第二个(非展开)segue 链接回来,那么这就是您的问题。这将导致您每次都创建第一个视图控制器的新实例。

至于释放内存,您当然可以在 viewDidDisappear 中将视图的 animationImages 数组设置为 inil,然后在 viewWillAppear 中重新加载图像,但每次往返都会增加内存占用是没有意义的第二个视图控制器。这表明有问题。

【讨论】:

  • 你可能是对的,因为我没有使用 unwind segue;我只是链接回来。内存使用量在第一次加载时跳跃约 30mb,然后每次加载后跳跃在 1.5-3mb 之间。我只是希望它回到正常的位置,当它在 Home VC 上时,当我关闭视图后返回时。
  • 刚刚实现了展开,它对内存使用没有影响。
  • 问题的根本原因是您无法分配大量 UIImage 对象。您的代码一次只需要加载 1 个图像,否则旧设备会因内存使用而崩溃。关于这个问题的更多信息可以在这里找到stackoverflow.com/questions/8112698/…
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多