2010-10-07 69 views
0

我寫了一個將圖像加載到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中不起作用。
謝謝,原諒我的英語。

回答

3

您有責任通過調用CGImageRelease來釋放此對象。

參見垃圾收集的文檔:

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

默認情況下,因此,在一個垃圾收集的環境中,你管理的核心基礎正是對象,你在引用計數的環境會(如在「核心基礎」>「所有權策略」的「內存管理編程指南」中有介紹)。如果您創建或複製Core Foundation對象,則必須隨後在完成後釋放它。如果您想保留Core Foundation對象,則必須保留該對象,並在完成後再次釋放它。

+0

首先,謝謝你的回答。我應該如何寫完成方法?此代碼是否正確?: CGImageRelease(aLayer.content); aLayer = nil – Fernando 2010-10-07 16:45:07

+0

內容由圖層保留,所以您可以在aLayer.contents賦值後立即釋放它。請記住,您不應該使用像loadImage這樣的名稱,而是使用createImage,因爲您擁有返回的圖像(請參閱Core Management的內存管理編程指南)。 – 2010-10-07 16:59:27

+0

謝謝!我嘗試它。 – Fernando 2010-10-07 17:40:47

2

垃圾回收器確實使用CoreFoundation類型。

看到CFMakeCollectable(摘自CF文檔):

CFTypeRef CFMakeCollectable(CFTypeRef CF);

創建一個新分配的核心 基金會對象符合垃圾收集標準 。

參數cf一個CFType對象,使 可收集。該值不得爲 NULL。返回值cf

討論有關更多詳細信息,請參閱 垃圾回收程序設計指南。