unsigned char * pixels = malloc(...);
Вы владеете буфером pixels
, потому что его заблокировали.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, pixelBufferSize, NULL);
Базовая графика соответствует правилам Core Foundation.У вас есть поставщик данных, потому что вы создали его.
Вы не предоставили обратный вызов освобождения, поэтому у вас все еще есть буфер pixels
.Если бы вы предоставили обратный вызов освобождения, объект CGDataProvider стал бы владельцем буфера здесь.(Как правило, хорошая идея.)
CGImageRef imageRef = CGImageCreate(..., provider, ...);
Вы владеете объектом CGImage, потому что вы его создали.
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
Вы владеете объектом UIImage, потому что вы его заблокировали.
Вы также все еще являетесь владельцем объекта CGImage.Если объект UIImage хочет владеть объектом CGImage, он либо сохранит его, либо создаст свою собственную копию.
return [image autorelease];
Вы отказываетесь от владения изображением.
Таким образом, ваш код утечкипиксели (вы не передали право собственности провайдеру данных и не выпустили их сами), провайдеру данных (вы не опубликовали его) и CGImage (вы не опубликовали его).Фиксированная версия передает владение пикселями поставщику данных и выпускает как поставщика данных, так и CGImage к тому времени, когда UIImage будет готов.Или просто используйте imageWithData:
, как предложил KennyTM.