合并两个 UIImage 时收到内存警告

Posted

技术标签:

【中文标题】合并两个 UIImage 时收到内存警告【英文标题】:Receive Memory warning in combining two UIImage 【发布时间】:2017-05-03 15:38:20 【问题描述】:

我尝试将两个 UIImage 与以下代码结合起来:

- (void)combineImage:(UIImage *)image WithFrame:(CGRect)frame Completion:(ImageProcessorCompletionBlock)block 
    __weak typeof(self) wSelf = self;

    dispatch_async(_queue, ^
        if (wSelf) 
            typeof(wSelf) sSelf = wSelf;

            UIGraphicsBeginImageContextWithOptions(sSelf.originalImage.size, NO, 0.0);

            [sSelf.originalImage drawInRect:CGRectMake(0, 0, sSelf.originalImage.size.width, sSelf.originalImage.size.height)];
            [image drawInRect:frame];

            UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();

            dispatch_async(dispatch_get_main_queue(), ^
                if (block) 
                    block(result);
                
            );
        
    );

这行得通,但是当我检查内存的使用情况时,它吓到了我。每次我运行该方法时,内存都会上升并且永远不会释放。有时我会收到内存警告。谁能告诉我为什么并给我解决问题的方法?非常感谢!

【问题讨论】:

不相关,但您的 if (block) 检查应包含整个方法体。如果调用者不关心结果,那么做任何工作都是没有意义的。 可能是你的图片太大了? 图像很大(对于信封背面的计算,它是 4 x 宽度 x 比例 x 高度 x 比例;例如,在 3x 比例设备上使用 1000 x 1000 时可能需要大约 36mb)。如果你的内存没有被释放,那么使用“调试内存图”功能并识别任何应该被释放的对象,看看是否有任何意外的强引用徘徊。但是上面的代码不太可能是re unreleased memory问题的根源。 见***.com/a/30993476/1271826 【参考方案1】:

我终于找出了问题所在。 UIGraphicsBeginImageContextWithOptions(sSelf.originalImage.size, NO, 0.0);

第一个参数是图像的大小,最后一个是比例因子。一开始我已经将图像尺寸设置为与原始尺寸相同。但我也将比例设置为0.0,这意味着它设置为设备主屏幕的比例因子。所以result 图像被放大了。

如果我多次运行代码,result 的大小会越来越大,最后它会耗尽内存并收到警告。

【讨论】:

以上是关于合并两个 UIImage 时收到内存警告的主要内容,如果未能解决你的问题,请参考以下文章

从相机点击多张图像时收到内存警告

内存警告后释放 UIImage 时崩溃

将图像选择器相机转移到一个视图到另一个视图时的内存警告

使用 UIImagePicker 一次后的内存警告

[UIImage imageWithContentsOfFile:@""] 内存警告

收到内存警告时 UICollectionView 维护的单元队列会发生啥?