0

Image を CALayer にロードするメソッドを書きました。これはコードです:

- (CGImageRef)loadImage:(NSString*)path {
          // Get data image
          CGImageRef image = NULL;
          NSData *data = [NSData dataWithContentsOfFile:path];
          CFDataRef imgData = (CFDataRef)data;
          CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData (imgData);

          // Get CGImage from CFDataRef
          image = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);

          // If the image isn't a JPG Image, would be PNG file
          if (!image)
               image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);

          return image;
}

私はCALayerでこの方法を使用しています:

NSString *pathString = // my image path;
aLayer = [CALayer layer];
aLayer.contents = [self loadImage:pathString];

仕事です。ビューを (ガベージ コレクターを使用して) ファイナライズしましたが、アプリケーションにリークがあります。CFDataRef imgData をリリースする必要がありますか? Core Foundation ではガベージ コレクターが機能しないと読みました。
ありがとう、私の英語を許してください。

4

2 に答える 2

3

CGImageReleaseを呼び出して、このオブジェクトを解放する必要があります。

ガベージコレクションに関するドキュメントを参照してください。

http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html

したがって、デフォルトでは、ガベージコレクション環境では、参照カウント環境の場合とまったく同じようにCore Foundationオブジェクトを管理します(Core Foundationのメモリ管理プログラミングガイド>「所有権ポリシー」で説明されています)。Core Foundationオブジェクトを作成またはコピーする場合は、作業が終了したら、後でリリースする必要があります。Core Foundationオブジェクトを保持したい場合は、それを保持し、終了したら再度解放する必要があります。

于 2010-10-07T15:02:35.347 に答える
2

ガベージ コレクターCoreFoundation 型で機能します。

CFMakeCollectable を参照してください (CF ドキュメントからの抜粋):

CFTypeRef CFMakeCollectable(CFTypeRef cf);

新しく割り当てられた Core Foundation オブジェクトをガベージ コレクションの対象にします。

パラメータcf収集可能にする CFType オブジェクト。この値は NULL であってはなりません。戻り値cf

ディスカッション 詳細については、ガベージ コレクション プログラミング ガイドを参照してください。

于 2010-11-07T18:57:08.740 に答える