Как автоматически выпустить CGImageRef? - PullRequest
3 голосов
/ 15 августа 2011

У меня есть метод, который возвращает объект CGImageRef.Он содержит этот вызов:

CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
...
return posterFrame;

Эта ситуация, насколько я понимаю, требует автоматического выпуска.Но я понятия не имею, как это сделать.Я пытался использовать CFCollectable (), но это не работает.Есть идеи?

Ответы [ 2 ]

12 голосов
/ 15 августа 2011

Если вы используете сборщик мусора, используйте CFMakeCollectable(posterFrame).Если вы используете традиционное управление памятью, это очень просто:

return (CGImageRef)[(id)posterFrame autorelease];

Вы приводите CFTypeRef (в данном случае CGImageRef) к указателю объекта Objective-C, отправляя ему -autorelease сообщение, а затем приведите результат обратно к CGImageRef.Этот шаблон работает для (почти) любого типа, совместимого с CFRetain() и CFRelease().

5 голосов
/ 15 августа 2011

Core Graphics (и Core Foundation) не имеет пула автоматического выпуска , поэтому, если вы хотите вернуть CGImageRef, вам нужно либо назвать свою функцию, содержащую Create (например, MyCreatePosterImage())) или вернуть UIImage объект вместо:

CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
UIImage *result = [UIImage imageWithCGImage:posterFrame];
CGImageRelease(posterFrame);
return result;
...