2010-10-07 2 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

По умолчанию, таким образом, в среде сборки мусора управлять объектами ядра Foundation именно так, как вы бы в опорном подсчетом среде (как описанных в Руководстве по программированию управления памятью для Core Foundation> «Политика владения»). Если вы создаете или копируете объект Core Foundation, вы должны впоследствии выпустить его, когда закончите с ним. Если вы хотите сохранить объект Core Foundation, вы должны сохранить его и снова впоследствии освободить, когда вы закончите с ним.

+0

Во-первых, спасибо за ваш ответ. Как я должен написать метод завершения? будет ли этот код правильным: CGImageRelease (aLayer.content); aLayer = nil – Fernando

+0

Содержимое сохраняется слоем, поэтому вы можете освободить его сразу после назначения aLayer.contents. Имейте в виду, что вы не должны использовать имя, подобное loadImage, но вместо createImage, поскольку вы являетесь владельцем возвращаемого изображения (см. Руководство по программированию памяти для Core Foundation). –

+0

спасибо !! Я попробую. – Fernando

2

сборщик мусора Работа с типами CoreFoundation.

см CFMakeCollectable (выдержка из CF Документов):

CFTypeRef CFMakeCollectable (CFTypeRef CF);

Создает вновь выделенный сердечник Объект фонда, пригодный для мусора коллекция.

Параметры cf Объект CFType для создания коллекционный. Это значение не должно быть NULL. Возвращаемое значение cf.

Обсуждение Для получения дополнительной информации см. Руководство по программированию сборщиков мусора.

Смежные вопросы