0

計測器の助けを借りて、CGDataProviderCopyDataが多すぎるメモリを使用していることがわかります。問題を解決するには?Objective-C:CGDataProviderCopyDataを使用したメモリリーク

-(UIImage*)imageNamed:(NSString*)name { 

UIImage *uiimage = [UIImage imageNamed:name]; 


CGImageRef originalImage = [uiimage CGImage]; 
CFDataRef imageData = CGDataProviderCopyData(
     CGImageGetDataProvider(originalImage)); 
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData); 
CFRelease(imageData); 
CGImageRef image = CGImageCreate(
     CGImageGetWidth(originalImage), 
     CGImageGetHeight(originalImage), 
     CGImageGetBitsPerComponent(originalImage), 
     CGImageGetBitsPerPixel(originalImage), 
     CGImageGetBytesPerRow(originalImage), 
     CGImageGetColorSpace(originalImage), 
     CGImageGetBitmapInfo(originalImage), 
     imageDataProvider, 
     CGImageGetDecode(originalImage), 
     CGImageGetShouldInterpolate(originalImage), 
     CGImageGetRenderingIntent(originalImage)); 
CGDataProviderRelease(imageDataProvider); 



return [UIImage imageWithCGImage:image]; 
} 

Instrument screenshot

+0

この問題を引き起こすコードを教えてください。 – JeremyP

+0

スクリーンショットのコードを確認してください。あなたはスクリーンショットを見ませんか? –

+0

コードを画像として投稿しないでください。実際のコードをコピーして貼り付けます。 – rmaddy

答えて

1

問題は、あなたがimageを解放することはありませんということです。

次のようにコードを更新します。

-(UIImage*)imageNamed:(NSString*)name { 
    UIImage *uiimage = [UIImage imageNamed:name]; 

    CGImageRef originalImage = [uiimage CGImage]; 
    CFDataRef imageData = CGDataProviderCopyData(
      CGImageGetDataProvider(originalImage)); 
    CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData); 
    CFRelease(imageData); 
    CGImageRef image = CGImageCreate(
      CGImageGetWidth(originalImage), 
      CGImageGetHeight(originalImage), 
      CGImageGetBitsPerComponent(originalImage), 
      CGImageGetBitsPerPixel(originalImage), 
      CGImageGetBytesPerRow(originalImage), 
      CGImageGetColorSpace(originalImage), 
      CGImageGetBitmapInfo(originalImage), 
      imageDataProvider, 
      CGImageGetDecode(originalImage), 
      CGImageGetShouldInterpolate(originalImage), 
      CGImageGetRenderingIntent(originalImage)); 
    CGDataProviderRelease(imageDataProvider); 

    UIImage *result = [UIImage imageWithCGImage:image]; 
    CFImageRelease(image); 

    return result; 
} 
+0

私は既にイメージをリリースしようとしましたが、クラッシュが発生します。 CGImageRelease(画像)です。 CFImageRelease(イメージ)ではありません。 –

1

は最後に、私はこの問題を解決することができました。実際にはメモリリークの原因となっていた余分な不要なステップはほとんどありませんでした。ここでは、更新機能は次のとおりです。

-(UIImage*)imageNamed:(NSString*)name { 

UIImage *uiimage = [UIImage imageNamed:name]; 


CGImageRef originalImage = [uiimage CGImage]; 

CGImageRef image = CGImageCreate(
    CGImageGetWidth(originalImage), 
    CGImageGetHeight(originalImage), 
    CGImageGetBitsPerComponent(originalImage), 
    CGImageGetBitsPerPixel(originalImage), 
    CGImageGetBytesPerRow(originalImage), 
    CGImageGetColorSpace(originalImage), 
    CGImageGetBitmapInfo(originalImage), 
    CGImageGetDataProvider(originalImage), 
    CGImageGetDecode(originalImage), 
    CGImageGetShouldInterpolate(originalImage), 
    CGImageGetRenderingIntent(originalImage)); 

return [UIImage imageWithCGImage:image]; 
} 

CGImageGetDataProvider(originalImage)はCGDataProviderRefを返し、それがCGImageCreate関数の第八のパラメータとして必要とされます。 CGDataProviderRefを作成してイメージデータをコピーする上記の手順は不要でした。

関連する問題