2013-04-18 2 views
2

Каковы правила управления памятью для CGImageRef с ARC? То есть, может кто-нибудь помочь мне в правильной документации?Правила управления памятью CGImageRef?

Я получаю изображения из библиотеки фотографий и создания UIImage для отображения:

CGImageRef newImage = [assetRep fullResolutionImage]; 
... 
UIImage *cloudImage = [UIImage imageWithCGImage:newImage scale:scale orientation:orientation]; 

мне нужно сделать CGImageRelease(newImage) ли?

Я получаю предупреждения о памяти, но это не кажется быть постепенным наращиванием объектов, которые я не выпустил, и я не вижу утечек с помощью инструментов. Я озадачен.

ответ

7

Нет, вам не нужно вызывать CGImageRelease() на CGImageRef возвращенного ALAssetRepresentation «s удобные методы, как fullResolutionImage или fullScreenImage. К сожалению, в настоящее время документация и файлы заголовков для этих методов не делают это ясным.

Если вы создали CGImageRef самостоятельно, используя одну из функций CGImageCreate*(), тогда вы являетесь владельцем и несете ответственность за освобождение этого изображения ref, используя CGImageRelease(). В противоположность этому, CGImageRef s, возвращаемые fullResolutionImage и fullScreenImage, по-видимому, являются «автореализованными» в том смысле, что у вас нет изображения ref, возвращаемого этими методами. Например, скажем, вы пытаетесь что-то подобное в вашем коде:

CGImageRef newImage = [assetRep fullResolutionImage]; 
... 
UIImage *cloudImage = [UIImage imageWithCGImage:newImage 
         scale:scale orientation:orientation]; 
CGImageRelease(newImage); 

Если запустить статический анализатор, он будет выдавать следующее предупреждение для CGImageRelease(newImage); линии:

Неправильного декремент счетчика ссылок объекта, который не принадлежащий в данный момент вызывающей

Заметим, что вы получите это предупреждение, независимо от того, является ли ваш проект настроен на использование Ручной подсчет ссылок или AR C.

В отличие от этого, в документации по CGImage методу NSBitmapImageRep, например, делает тот факт, что CGImageRef возвращаемый autoreleased более ясно:

CGImage

Возвращает объект ядра графического изображения из текущих точечных данных приемника .

- (CGImageRef)CGImage

Возвращаемое значение

Возвращает autoreleased CGImageRef непрозрачный типа на основе текущих растровых данных приемника.

+0

Благодарим за продуманный ответ. Статический анализатор. Надо помнить об этом чаще. –

+2

Вам просто нужно запомнить правила управления памятью Core Foundation. Если имя функции имеет «Создать» в ней, то вы управляете своей памятью; если нет, то вы этого не сделаете. – fumoboy007

+0

@ fumoboy007 Это правило очень полезно. –

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