Утечка памяти с пикселями UIImage? - PullRequest
2 голосов
/ 09 апреля 2011

Я работал над кодом, который получает пиксели изображения, модифицирует их и затем возвращает изображение.Когда я запускаю его в Instruments, он говорит, что в строках кода есть утечки, помеченные знаком ★.Следующий код просто возвращает исходные пиксели без каких-либо изменений:

CFDataRef CopyImagePixels(CGImageRef inImage) {
return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); }

- (UIImage *) imagePixels:(UIImage*)imge {

CGImageRef img=imge.CGImage;
CFDataRef dataref=CopyImagePixels(img);
UInt8 *data=(UInt8 *)CFDataGetBytePtr(dataref);
int length=CFDataGetLength(dataref);

for (int i = 0; i < length; i+=4)
{
    UInt8 b_pixel = data[i];
    UInt8 g_pixel = data[i+1];
    UInt8 r_pixel = data[i+2];

    float outputRed = r_pixel;
    float outputGreen = g_pixel;
    float outputBlue = b_pixel;

    data[i] = outputBlue;
    data[i+1] = outputGreen;
    data[i+2] = outputRed;
}
CFDataRef newData=CFDataCreate(NULL,data,length);★
CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData);★
CGImageRef newImg=CGImageCreate(CGImageGetWidth(img),CGImageGetHeight(img),CGImageGetBitsPerComponent(img),★
                                CGImageGetBitsPerPixel(img),CGImageGetBytesPerRow(img),CGImageGetColorSpace(img),
                                CGImageGetBitmapInfo(img),provider,NULL,true,kCGRenderingIntentDefault);
UIImage*Result = [UIImage imageWithCGImage:newImg];
CGImageRelease(newImg);
CGDataProviderRelease(provider);
CFRelease(newData);
CFRelease(dataref);
return Result; }

Я не знаю, почему это появляется.Я пытался найти ответ, но ни один из них не работает.

Спасибо

ОБНОВЛЕНИЕ 1 Утечка происходит от этого метода:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
ImageView.image = [oimage imagePixels:ImageView.image]; }

И здесь устанавливается oimage:

-(void)viewDidAppear:(BOOL)animated {
mainDelegate = (PhotoAppDelegate *)[[UIApplication sharedApplication]delegate];

CGSize size = mainDelegate.CurrentImage.size; 
UIGraphicsBeginImageContext( size );
[mainDelegate.CurrentImage drawInRect:CGRectMake(0,0,size.width ,size.height )];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();//LEAK
UIGraphicsEndImageContext();

int kMaxResolution = 300;
CGImageRef imgRef = newImage.CGImage;
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGRect bounds = CGRectMake(0, 0, width, height);
if (width > kMaxResolution || height > kMaxResolution) {
    CGFloat ratio = width/height;
    if (ratio > 1) {
        bounds.size.width = kMaxResolution;
        bounds.size.height = bounds.size.width / ratio;
    }
    else {
        bounds.size.height = kMaxResolution;
        bounds.size.width = bounds.size.height * ratio;
    }
}

CGSize newsize = CGSizeMake(bounds.size.width, bounds.size.height);
UIGraphicsBeginImageContext(newsize);
[newImage drawInRect:CGRectMake(0, 0, newsize.width, newsize.height)];

newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
oimage = [newImage retain];
ImageView.image = oimage; }

Кроме того, в правой боковой панели инструментов нажатие на объект для утечки в нижнем центральном окне покажет вам в боковой панели, где находится ссылкаисходя из вашего кода.

Заранее спасибо

1 Ответ

1 голос
/ 09 апреля 2011

Код, который вы разместили, не пропускает, так что вот несколько сценариев.

  • Утечка в другом месте, вы неправильно интерпретируете результаты утечек.
  • Нет утечек, вы неправильно интерпретируете результаты утечек.
  • Утечки неверны (я не видел этого, но, возможно, что-то в вашем коде сбивает с толку)

Когда вы говорите

Когда я запускаю его в Инструментах, он говорит в строках кода есть утечки ...

Что вы имеете в виду? Насколько я знаю, утечки не могут и не сообщают вам конкретную строку, ответственную за утечку, она дает вам историю утечки объекта, и вам нужно решить, перезаписали ли вы утечку объекта или недооценено. это.

Если бы у вас была только одна строка в истории размещения объекта (создание объекта), тогда ваша проблема была бы недоработана, но ни один из объектов в вашем опубликованном коде не имел бы однострочной истории.

Может быть, вы можете опубликовать скриншот?

...