内存泄漏与UIImage方法“drawInRect”

时间:2014-12-18 10:16:06

标签: ios memory uiimage drawinrect

我对正确使用UIImage和方法drawInRect有疑问。

我使用的是iPad 4,Xcode版本6.1.1,IOS 8.1.2我使用了ARC而且我尝试过没有ARC

所以,我有图像“1.jpg”。

图片属性:

尺寸: 7500 x 8871像素

分辨率: 72像素/英寸

色彩空间: RGB

Alpha频道:

我需要重新缩放原始图像“1.jpg”

我使用此代码:

UIImage *originalImage=[UIImage imageNamed:@"1.jpg"];
CGSize newSize=(CGSizeMake(4096, 4096));
originalImage=[self GetScaledImage : originalImage andSize: newSize];

// ----缩放方法---------------------- //

-(UIImage *) GetScaledImage :(UIImage *) inputImage andSize :(CGSize) inputSize
{

 UIImage *newImage=[[[UIImage alloc] initWithCGImage:inputImage.CGImage] autorelease];    
 if (newImage)
 {        
     UIGraphicsBeginImageContext(inputSize);
     [newImage drawInRect: CGRectMake(0, 0, inputSize.width, inputSize.height)];
     newImage = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();
 }

 return newImage;
}

我的问题:

如果我使用newSize:(4096,4096)

UIImage *originalImage=[UIImage imageNamed:@"1.jpg"];
CGSize newSize=(CGSizeMake(4096, 4096));

现在内存: 3.1 MB

originalImage=[self GetScaledImage : originalImage andSize: newSize];

现在内存: 4.3 MB

它的工作正确

如果我使用newSize:(3000,4096)

我有这个:

UIImage *originalImage=[UIImage imageNamed:@"1.jpg"];
CGSize newSize=(CGSizeMake(3000, 4096));

现在内存: 3.1 MB

originalImage=[self GetScaledImage : originalImage andSize: newSize];

现在内存: 52 MB

并且工作不正确

和魔法:如果我使用newSize:(4096,3000)它也可以正确(3000,4096)工作不正确

所以,我的问题:它是如何运作的?

1 个答案:

答案 0 :(得分:0)

我想没有魔法。 CGImage对象未被释放但拥有。为此,您需要将image.CGImage设置为某个变量,然后使用

将其释放

CFRelease(cgImage);

在完成所有处理后,还要尝试清除图形上下文。