因内存压力而终止已知原因,未知解决scheme

我的应用程序正在终止,由于在应用程序的使用某一点的内存压力,我已经将问题隔离到导致问题的一个代码块。

我将复制下面的代码块,但首先我将描述它在做什么。

说明

我有一个循环遍历video列表。 对于每个video,for循环都会增加包含scrollview的大小,绘制一个标签和一个button(都与video有关),并asynchronous抓取video的缩略图并将其放置在button下方。

问题

抓住缩略图部分是问题。 我不认为这是asynchronous完成的事实是问题,因为我已经同步尝试了,并且终止仍然发生。 当我注释掉抓取缩略图的代码(下面代码中的整个asynchronous部分)时,应用程序不会崩溃。

守则

注意:为了简洁,我在某些情况下使用注释来replace代码。

for (int i = [_videoURLs count]-1; i >= 0 ; i--) { //increase the scrollview size //get background image: dispatch_async(screenshotQueue, ^{ AVURLAsset *as = [[AVURLAsset alloc] initWithURL:currentURL options:nil]; AVAssetImageGenerator *ima = [[AVAssetImageGenerator alloc] initWithAsset:as]; ima.appliesPreferredTrackTransform = YES; NSError *err = NULL; CMTime time = CMTimeMake(1, 24); CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err]; UIImage *thumbnail = [[UIImage alloc] initWithCGImage:imgRef]; dispatch_async(dispatch_get_main_queue(), ^{ UIImageView *backgroundImage = [[UIImageView alloc]initWithFrame:buttonFrame]; backgroundImage.image = thumbnail; backgroundImage.layer.opacity = 0; [self.videoScrollView addSubview:backgroundImage]; [self.videoScrollView sendSubviewToBack:backgroundImage]; [UIView animateWithDuration:0.5 delay:0.0 options: UIViewAnimationOptionCurveEaseInOut animations:^{ backgroundImage.layer.opacity = 1; } completion:^(BOOL finished){}]; }); }); //add title to the screen caps //draw the button } 

我在Xcode 5上,使用iOS 7在新设备上进行testing。我是自学的,所以我确信我已经拿起了我的坏习惯,但是我希望我已经错过了一些明显的东西多一点经验的人会接受。

我已经尝试了大量的谷歌search和堆栈溢出search,并试图在诊断,日志和内存configuration文件进一步隔离问题,无济于事。

任何帮助将不胜感激!

编辑

如何重现错误:

  1. 转到video列表
  2. 离开video列表
  3. 重复1 + 2 4或5次导致崩溃

第2步,只需从其超级视图中删除整个的scrollView,然后重画它。 我知道没有必要重新画一个video列表,每当你回到它,但我这样做是有一定的原因,我不相信这是问题的根源(我可能是错的)。

编辑2

这是一个内存configuration文件的图像: 在这里输入图像说明

你显示的代码有一个巨大的泄漏。 您正在创build一个Core Foundation对象:

 CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err]; 

但我没有看到相应的CFRelease

你的代码应该是:

 CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err]; UIImage *thumbnail = [[UIImage alloc] initWithCGImage:imgRef]; CFRelease(imgRef); 

好吧,所以我find了一个体面的解决scheme。 我仍然不完全确定为什么这是一个问题,但我有一些怀疑。

我相信生成缩略图的过程太密集,无法在for循环上重复执行一个线程。 我有这个预感,所以决定调整上面的代码。 我不会每次都生成一个新的缩略图,而是将新生成的截图保存为文件主目录中的png。 然后下一次,我会从那里加载这个资源。 这导致内存问题消失。

我希望这能帮助有类似问题的人 – 如果有人有什么需要补充的,或者有更好的答案,那么我就是所有人。