0

UPDATE这段代码其实不是问题所在;注释掉所有CoreGraphics行并返回数组中的第一个图像,因为结果并不能防止崩溃的发生,所以我必须向上游看。CoreGraphics内存警告和崩溃;仪器显示没有内存泄漏

我在75ms NSTimer上运行这个。它适用于480x360的图像,并且可以整天运行而不会崩溃。

但是,当我发送的图像是1024x768,它会在大约20秒后崩溃,给出了几个低内存警告。

在这两种情况下,仪器都显示绝对正常的内存使用情况:平面分配图,小于一兆字节的活动字节,整个时间无泄漏。

那么,这是怎么回事?核心图形不知何故使用太多内存而不显示它?

另外值得一提的是:(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

崩溃日志显示多少内存?你使用'[UIImage imageNamed:]'? – Kevin

+0

我没有在任何地方使用[UIImage imageNamed:] - 所有图像都从相机捕获并发送到imageBuffer类,该类返回图像的NSMutableArrays。它崩溃而没有崩溃日志输出,但在设备日志中,它看起来像进程正在使用62582个页面。 –

回答

0

听起来像我这样的问题是你已经显示的代码之外。屏幕上显示的图像在应用程序内存之外有一个后备存储,宽度*高度* bytes_per_pixel。如果您的支持存储太多,您还会收到内存警告和应用程序终止。

您可能需要在那里进行优化,以创建这些图像的较小优化版本以供显示或允许发布后备存储。对于某些非变化图层,启用光栅化也可以帮助您将图层内容直接设置为CGImage,而不是使用UIImages。

您应该制作一个示例项目,演示其周围没有其他代码的问题并查看您是否仍然内存不足。但是因为我怀疑你会发现,只要你已经显示的代码,你将无法再现其他地方的isse。

+0

这是完全正确的;我减少了正在存储的'UIImage'的数量,这就停止了崩溃。 为了解决这个限制,我将尝试将图像存储为'UIImageJPEGRepresentation's,然后根据需要将它们重新放入'[UIImage imageWithData:]'中。希望它会足够快。 –