Qual é o padrão de gerenciamento de memória correto para buffer-> CGImageRef-> UIImage?

Eu tenho uma função que pega alguns dados de bitmap e retorna um UIImage * dele. Parece algo assim:

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];
}

Alguém pode explicar exatamente quem possui qual memória aqui? Quero limpar corretamente, mas não sei como fazê-lo com segurança. Os documentos são confusos quanto a isso. Se eufree pixels no final desta função após criar a UIImage e, em seguida, usar a UIImage, eu falho. Se eu liberar o provedor ou o imageRef após criar a UIImage, não vejo uma falha, mas aparentemente eles estão passando os pixels o tempo todo, por isso estou preocupado em liberar esses estados intermediários.

(Eu sei por documentos do CF que eu preciso chamar a liberação nos dois últimos porque eles vêm das funções Create, mas posso fazer isso antes que a UIImage seja usada?) Presumivelmente, posso usar o retorno de chamada desalocado do provedor para limpar o buffer de pixels , mas o que mais?

Obrigado!

questionAnswers(4)

yourAnswerToTheQuestion