Утечка памяти в iOS с CGContextRef
У меня есть набор кода, который берет изображение, хранящееся в UIImageView, и изменяет его содержимое для копирования в новое изображение для другого UIImageView. Проблема в том, что этот код всегда получает предупреждение о памяти от моего компилятора, когда я анализирую проект. Я пытался реализовать этот код различными способами, и я всегда получал предупреждение о различном виде памяти. Выходные данные компилятора говорят, что "вызов функции" CGBitMapContextCreateImage "возвращает базовый базовый объект с счетом сохранения +1", и это приводит к тому, что объект изображения имеет счет сохранения +1. Если я автоматически освобождаю объект изображения, у компилятора появляется предупреждение о том, что авто-выпуск вызывается много раз, а объект изображения изначально имел счет сохранения 0.
Разве эти два предупреждения компилятора не противоречат друг другу? Как я могу исправить этот код, чтобы избежать утечек памяти?
-(UIImage *) makeImageLight{
UIImage * image = self.masterImage.image;
NSUInteger width = image.size.width;
NSUInteger height = image.size.height;
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = width * bytesPerPixel;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bmContext, (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = width, .size.height = height}, image.CGImage);
UInt8* data = (UInt8*)CGBitmapContextGetData(bmContext);
for (size_t i = 0; i < CGBitmapContextGetWidth(bmContext); i++)
{
for (size_t j = 0; j < CGBitmapContextGetHeight(bmContext); j++)
{
int pixel = j * CGBitmapContextGetWidth(bmContext) + i;
pixel = pixel * 4;
UInt8 red = data[pixel + 1]; // If you need this info, enable it
UInt8 green = data[pixel + 2]; // If you need this info, enable it
UInt8 blue = data[pixel + 3]; // If you need this info, enable it
red = ((255 - red) * .3) + red;
green = ((255 - green) * .3) + green;
data[pixel + 1] = red;
data[pixel + 2] = green;
data[pixel + 3] = blue;
}
}
// memory warning occurs in the following line:
image = [UIImage imageWithCGImage:CGBitmapContextCreateImage(bmContext)];
CGContextRelease(bmContext);
return image;
}
Неважно, я исправил это, добавив следующий код, чтобы выпустить CGImage, созданный из контекста:
CGImageRef imageRef = CGBitmapContextCreateImage(bmContext);
image = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
1 ответ
Вы используете CGBitmapContextCreateImage() для создания CGImage, но вы не выпустили этот CGImage
Вам нужно разделить UIImage
создание строки следующим образом:
CGImageRef cgimage = CGBitmapContextCreateImage(bmContext);
image = [UIImage imageWithCGImage:cgimage];
CGImageRelease(cgimage);