Mat*_*zak 7 memory objective-c ios
我的应用程序由于应用程序使用中某个点的内存压力而终止,我已将问题分解为造成问题的一大块代码.
我将复制下面的代码块,但首先我将描述它正在做什么.
描述:
我有一个迭代视频列表的for循环.对于每个视频,for循环增加包含滚动视图的大小,绘制标签和按钮(均与视频有关),并异步抓取视频的缩略图并将其放在按钮下方.
问题:
抓住缩略图部分就是问题所在.我不认为这是异步完成的事实是问题,因为我已经同步尝试并且终止仍然发生.当我注释掉抓取缩略图的代码(下面代码中的整个异步部分)时,应用程序不会崩溃.
守则:
注意:为简洁起见,我在某些情况下使用注释替换代码.
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
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Xcode 5,在iOS 7的新设备上进行测试.我是自学成才,所以我确信我已经找到了一些不良习惯,但我希望我错过了一些明显的东西.有经验的人会接受.
我已经尝试了相当数量的谷歌搜索和搜索堆栈溢出,并尝试查看诊断,日志和内存配置文件,以进一步隔离问题,无济于事.
任何帮助将不胜感激!
编辑:
如何重现错误:
步骤2.简单地从其superview中删除整个scrollView,然后重绘它.我知道每次回到视频列表都没有必要重新绘制视频列表,但我出于某种原因这样做,我不相信这是问题的根源(我可能是错的).
编辑2:
这是内存配置文件的图像:

Dav*_*d H 13
你展示的代码有很大的漏洞.您正在创建一个Core Foundation对象:
CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err];
Run Code Online (Sandbox Code Playgroud)
但我看不到相应的CFRelease.
你的代码应该是:
CGImageRef imgRef = [ima copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *thumbnail = [[UIImage alloc] initWithCGImage:imgRef];
CFRelease(imgRef);
Run Code Online (Sandbox Code Playgroud)