【问题标题】:Receive Memory warning in combining two UIImage合并两个 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问题的根源。

标签: ios objective-c uiimage


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 2011-09-12
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多