掩盖图像时内存增加

时间:2014-11-25 13:14:49

标签: ios objective-c uiimage

我使用以下代码创建一个蒙版的UIImage。然而,我发现,当我多次运行代码时,内存增加而不是释放。有人可以看到可能存在泄漏的地方吗?

-(UIImage*)processImage:(UIImage *)sourceImage maskImage:(UIImage *)maskImage  { 

UIImage *editedImage = nil;

UIImage *mask = [self createMaskImage:maskImage canvasImage:sourceImage maskWidth:50 maskHeight:50];

editedImage = [self maskImage:sourceImage withMask:mask];

return editedImage;
}



- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

CGImageRef maskRef = maskImage.CGImage;

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
return [UIImage imageWithCGImage:masked];

}

2 个答案:

答案 0 :(得分:2)

由于您使用的是CoreGraphics,因此ARC不适合您。

您正在使用CGImageCreateWithMask创建/分配。

然后您需要使用CGImageRelease将其删除。

答案 1 :(得分:2)

From Apple Documentation

使用蒙版遮罩图像创建的图像。您负责通过调用CGImageRelease来释放此对象。

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    CGImageRef maskRef = maskImage.CGImage;

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);


    // Create image from CGImageRef        
    UIImage  *myImage = [UIImage imageWithCGImage:masked];

    // Release it 
    CGImageRelease(masked);


    return myImage;

}