2009-08-12 27 views
3

CGImageRefで適切なメモリ管理を行っているのか不思議です。私はいくつかのメソッドを渡しています(CGオブジェクトなので、自動解放をサポートしていないと思います)。非NSObjectを使用したメモリ管理や他のNSObjectとのやりとりは、私にとってまだまだ新しいものです。私がやっているここでCGImage(CGImageRef)を解放する

私はCGBitmapContextCreateImageと私のイメージ・キャッシュ・マネージャ(数1を保持)内CGImageRefを作成し、NSMutableDictionary(カウント2を保持)にそれを追加しています。

CALayersがイメージを使用する場合、レイヤーを削除する前にlayer.contents(保持数+1)を割り当て、layer.contents = nil(保持回数-1)で内容を消去します。

は最後に、テクスチャをクリアするとき、私は0

として、カウントを保持するために持っているCGImageRefReleaseと[NSMutableDictionary REMOVEOBJECT]を呼び出すこれは、そうするための適切な方法ですか?あなたが記述

答えて

16

Core Foundation objects (which all Core Graphics objects are) do support autorelease.

の手順がうまく動作し、漏れたり、オブジェクトを介して、解放してはいけません。

私はCGImageReleaseのような特定クラスのリリース機能の代わりにCFReleaseを使用しますが、純粋にスタイルの問題として使用します。 NULLを気にする必要があります。NULLを確認するとCGImageReleaseNULLを渡すとCFReleaseがクラッシュします。 CGImageReleaseとその兄弟を使用すると、これについて心配する必要はありません。

私はremoveObject:forKey:ではなく、removeObjectではないことを前提としています(存在しないため、とにかくオブジェクトを指定することはできません)。

+0

リンクをありがとう、偉大なリソースは、多くを明確にします。 文書では、imageがNULLの場合はCGImageReleaseでエラーが発生しないので、より安全に聞こえます。 removeObject:forKey :,はい、その1つです。 – Rudi

+0

**あなたがリンクしている文書はあなたのクレームをサポートしていません**いくつかのCore FoundationオブジェクトはCocoaクラスに対して "フリーダイヤル"のブリッジですが、すべてがそうであるとは限りません。 'CFStringRef'を' NSString * 'にキャストすることもできますが、' CGImageRef'と 'UIImage'を使って行うことはできません。 – benzado

+0

私の主張は、CFオブジェクトが 'release'と' autorelease'をサポートしているということです。このドキュメントでは明示的にこう述べています: "メモリ管理関数とメソッドも互換性があることに注意してください.Core Foundationオブジェクトで' CFRelease'を使用し、Cocoaオブジェクトで 'release'と' autorelease'を使用することができます。 CGImageのリファレンスによると、CGImageはCFTypeに由来しています:http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGImage/ –