У меня есть функция, которая принимает некоторые растровые данные и возвращает UIImage * из нее. Это выглядит примерно так:Какой правильный шаблон управления памятью для буфера-> CGImageRef-> UIImage?
UIImage * makeAnImage()
{
unsigned char * pixels = malloc(...);
// ...
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, pixelBufferSize, NULL);
CGImageRef imageRef = CGImageCreate(..., provider, ...);
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
return [image autorelease];
}
Может кто-нибудь объяснить, кто владеет какой памятью здесь? Я хочу правильно очистить, но я не уверен, как сделать это безопасно. Документы нечеткие. Если I free
пикселей в конце этой функции после создания UIImage, а затем используйте UIImage, я сбой. Если я отпущу провайдера или imageRef после создания UIImage, я не вижу сбоя, но они, очевидно, пропускают пиксели на всем протяжении, так что я очень люблю выпускать эти промежуточные состояния.
(Я знаю, что для каждого документа, который должен быть вызван релизом, оба из них, поскольку они происходят из функций Create, но могу ли я сделать это до использования UIImage?) Предположительно, я могу использовать обратный вызов dealloc провайдера для очистить буфер пикселей, но что еще?
Спасибо!
Спасибо, Кенни. Это красиво сжатое описание; Я думаю, что меня немного бросили непредсказуемость буфера сырой кучи, но, как всегда, верю в правила, и вы будете вознаграждены. Приветствия. –
Чтобы добавить некоторые пояснения, ключевыми словами в основных функциях являются «Создать» и «Создать». Если функция содержит одно из этих слов, вы должны освободить возвращенную память. Большинство основных типов данных совместимы с CFType. Это означает, что вы можете использовать вызовы для сохранения/освобождения/автоматического резервирования Objective-C, если это проще. т.е. [(id) imageRef release]; или CFRelease (imageRef); –
Не забудьте проверить, является ли 'imageRef'' NULL', если вы используете 'CFRelease'. – kennytm