我想要在背景图片之上轻松地混合UIImage,因此编写了一个适用于UIImage的类别方法,该方法改编自基于顶部图像的alpha/透明度混合两个UIImage:
- (UIImage *) blendedImageOn:(UIImage *) backgroundImage {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
UIGraphicsBeginImageContext(backgroundImage.size);
CGRect rect = CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);
[backgroundImage drawInRect:rect];
[self drawInRect:rect];
UIImage* blendedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
[pool release];
return [blendedImage autorelease];
}
很不幸,我使用以上方法加载大约20张图片,并将它们与背景和光泽图像混合(因此可能涉及40个调用)的应用在设备上被强制退出。仪器会话揭示,由于调用drawInRect:而导致的malloc调用占用了大部分内存。我尝试用等效的函数调用CGContextDrawImage替换了drawInRect:消息,但没有帮助。我们在发现内存使用问题后添加了AutoReleasePool,但也没有产生任何影响。
我认为这可能是因为我没有正确使用图形上下文。在循环中调用上述方法是否是一个坏主意,因为我创建了许多上下文?还是我简单地错过了什么?
- 编辑1:感谢评论。该方法在控制器方法中被调用,该方法设置了20个视图,因此在循环中我有以下调用:
UIImage *blendedImage = [newImage blendedImageOn:backgroundImage];
我添加了自动释放池以确保在主自动释放池释放它们之前释放图像,理论上当循环结束时所有新的UIImages对象都应该被释放。但是,分析结果显示,无论是否存在自动释放池,都没有任何区别。
- 编辑2:是的,我也尝试在调用blendedImageOn:之前添加自动释放池,但没有效果。
- 编辑3:修复了由于自动释放池而释放UIImage的令人尴尬的错误。自动释放池的目的是释放除结果UIImage之外的任何对象,以防过多的内存是由于添加到主自动释放池中的临时对象导致的,这些对象不会立即被释放。
我试图询问的问题(我承认表述得非常糟糕!)是:为什么调用此方法20次会导致大量内存使用?