2010-12-31 14 views
5

CGImageRefを返すこのカスタムメソッドを使用しているときにメモリリークが発生しています。私はそれを返さなければならないので、「cgImage」を適切に解放することはできません。私は何をすればよいですか?CGImageRefメモリリーク

- (CGImageRef)rectRoundedImageRef:(CGRect)rect radius:(int)radius 
{ 
    CGSize contextSize = CGSizeMake(rect.size.width, rect.size.height);  
    CGFloat imageScale = (CGFloat)1.0; 
    CGFloat width = contextSize.width; 
    CGFloat height = contextSize.height;   
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(NULL, width * imageScale, height * imageScale, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 
    // Draw ... 
    // Get your image 
    CGImageRef cgImage = CGBitmapContextCreateImage(context);  
    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(context); 
    //CGImageRelease(cgImage); //If I release cgImage the app crashes. 
    return cgImage;  
} 
+0

私は同様のリークがありました。 ここで私の答えを試してください:http://stackoverflow.com/a/23669476/3631310 – Vlad

答えて

15

cgImageがあなたの方法によって所有され、あなたはそれを返し、CFReleaseを通してそれを解放するために、発信者に責任を与える必要があります。

ます。また、このように、UIImageインスタンス内にラップCGImageを返すことができます。

UIImage *image = [UIImage imageWithCGImage:cgImage]; 
CFRelease(cgImage); //cgImage is retained by the UIImage above 
return image; 
10

、CFには自動解放プールが存在しないため、これは、Core Foundationのオブジェクトの一般的な問題です私はそれを参照してください、あなたはこの問題を解決するには、2つのオプションがあります。

  1. を彼が返されたオブジェクトの所有権とそれを解放する責任を取り、発信者に伝えるために-newRectRoundedImageRef:radius:のようなものにする方法を変更します。
  2. CGImageRefをオートレリースされたUIImageオブジェクトにラップし、それを返します([UIImage imageWithCGImage:])。それはおそらく私がやることです。
3

あなたは、Core Foundation互換オブジェクトを自動リリースすることができます。ちょっと変わったようだ。 :)

GC-安全な方法はそうのようなものです:

CGImageRef image = ...; 
if (image) { 
    image = (CGImageRef)[[(id)image retain] autorelease]; 
    CGImageRelease(image); 
} 

Mac上でiOSの安全なものの、もはや安全ではありませんショートカットは、これです:

CGImageRef image = ...; 
if (image) { 
    image = (CGImageRef)[(id)image autorelease]; 
} 

どちらか1自動解放プールにイメージを配置し、リークを防止します。

2

示唆したように、我々は使用:

CGImageRelease(imageRef); 

を我々はまだメモリリークを得ました。 当社のソリューションは、

@autoreleasepool {} 

ブロックでコードをラップし、それが私たちの問題を解決することでした。

+0

@autoreleasepoolに言及した+1の答えは私の病気の治癒でした。 – Damo

+0

まだ正しくリリースされていませんtbh –