UPDATE 这段代码实际上不是问题所在;注释掉所有CoreGraphics行并返回数组中的第一个图像,因为结果不能防止崩溃发生,所以我必须向上游看。
我在75毫秒的NSTimer上运行它。它与480x360图像完美配合,可以全天运行而不会崩溃。
但是当我发送1024x768的图像时,它会在大约20秒后崩溃,并给出了几个低内存警告。
在这两种情况下,仪器显示绝对正常的内存使用情况:平面分配图,小于1兆字节的活字节,整个时间都没有泄漏。
那么,发生了什么? Core Graphics是否会以某种方式使用太多内存而不显示它?
另外值得一提的是:(NSMutableArray *)imgs中没有那么多的图像 - 通常是三个,有时是两个或四个。无论如何崩溃。当只有两个时,很快就会崩溃。
- (UIImage*) imagefromImages:(NSMutableArray*)imgs andFilterName:(NSString*)filterName {
UIImage *tmpResultant = [imgs objectAtIndex:0];
CGSize s = [tmpResultant size];
UIGraphicsBeginImageContext(s);
[tmpResultant drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeNormal alpha:1.0];
for (int i=1; i<[imgs count]; i++) { [[imgs objectAtIndex:i] drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeMultiply alpha:1.0]; }
tmpResultant = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return tmpResultant;
}
答案 0 :(得分:0)
听起来我觉得这个问题超出了你所展示的代码范围。屏幕上显示的图像在应用程序内存外部有一个后台存储区,宽度为* height * bytes_per_pixel。如果你有太多的后备存储,你也会得到内存警告和应用程序终止。
您可能需要在那里进行优化,以创建这些图像的较小优化版本以供显示,或者允许释放后备存储。同时为某些非变化图层启用光栅化可以在这里帮助,也可以将图层内容直接设置到CGImage,而不是使用UIImages。
你应该制作一个示例项目来演示围绕它没有其他代码的问题,看看你是否仍然没有内存。但是,我怀疑你会发现,只有你所展示的代码,你将无法再现其他地方的isse。