2012-10-06 14 views
5

私ははるかに複雑なプロジェクトの簡単なテストをしようとしていますが、なぜ以下のコードがクラッシュしてEXC_BAD_ACCESSエラーを出すのか困惑していますか?CGImageRefのUIImage

これはUIViewから呼び出されます。

- (void)testing { 
     NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"ball.png" ofType:nil]; 
     CGImageRef imageRef = [[[UIImage alloc]initWithContentsOfFile:imagePath]CGImage]; 
// CGImageRetain(imageRef); 

     UIImage *newImage = [[UIImage alloc]initWithCGImage:imageRef]; 
     UIImageView *iv = [[UIImageView alloc]initWithImage:newImage]; 
     [self addSubview:iv]; 
} 

私の推測では、CGImageRefが保持されていないことですが、CGImageRetain(imageRef)を追加します。違いはありません。

このプロジェクトでは、ARCが有効になっていることにも注意してください。

EDITは、私は少しより多くのテストを行なったし、私は上記のコードのみを含む2つの基本的なプロジェクトを作成したとして、これは直接ARCに関連していることを発見しました。 ARCをオフにして最初のものは完全に機能しました。次はARCをオンにし、BAMがクラッシュして同じエラーが発生します。面白いのは、実際にログエラーが発生したのは、クラッシュ前に初めてプロジェクトを実行したときだけです。

Error: ImageIO: ImageProviderCopyImageBlockSetCallback 'ImageProviderCopyImageBlockSetCallback' header is not a CFDictionary... 

答えて

9

CGImageRef imageRef = [[[UIImage alloc]initWithContentsOfFile:imagePath]CGImage]; 

作成UIImageは、このフル直後にリリースされる予定の機能の終わりに

CGImageRef imageRef = CGImageRetain([[UIImage alloc]initWithContentsOfFile:imagePath].CGImage); 

して、これを試してみてください式(この行の後など)。したがって、後でCGImageRetain()を追加しようとしても動作しません。

根本的な問題はCGImageから返さCGImageRefがほぼ確実UIImageのIVARあるとUIImageがdealloctedされたときにリリースされる予定です。

これを修正する一般的な方法は、UIImageの有効期間を延長することです。これは、ローカル変数にUIImageを置き、最後にCGImageを参照した後に参照することで可能です(例:(void)uiimageVar)。また、あなたは

CGImageRef imageRef = CGImageRetain([[[UIImage alloc] initWithContentsOfFile:imagePath] CGImage]); 

のように、その同じ行にCGImageRefを保持することができます。しかし、あなたがこれを行う場合は、設定が完了したときにimageRefを解放することを忘れないでください。

5

あなたがこの書いた:その行はUIImageを作成

CGImageRef imageRef = [[[UIImage alloc]initWithContentsOfFile:imagePath]CGImage]; 

を、そのCGImageプロパティを取得し、その後UIImageオブジェクトを解放します。その行にCGImageを保持していないため、CGImageの唯一の所有者はUIImageです。したがって、UIImageが解放され、直ちに割り当てが解除されると、CGImageの割り当ても解除されます。

UIImageがリリースされる前に、CGImageを保持する必要があります。この行が問題である

CGImageRelease(imageRef); 
+0

素晴らしいです、今私は何が起こっているかを正確に見ています。少なくとも私は正しい道を歩いていた。おかげでロブ。 – EcksMedia