Нет, вам не нужно вызывать 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
непрозрачный типа на основе текущих растровых данных приемника.
Благодарим за продуманный ответ. Статический анализатор. Надо помнить об этом чаще. –
Вам просто нужно запомнить правила управления памятью Core Foundation. Если имя функции имеет «Создать» в ней, то вы управляете своей памятью; если нет, то вы этого не сделаете. – fumoboy007
@ fumoboy007 Это правило очень полезно. –