Почему это утечка памяти? UIImage `cellForRowAtIndexPath:` - PullRequest
0 голосов
/ 03 июня 2010

Утечки инструментов говорят мне, что этот UIImage протекает:

UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png", [postsArrayID objectAtIndex:indexPath.row]]]];

// If image contains anything, set cellImage to image. If image is empty, try one more time or use noImage.png, set in IB
if (image != nil){
    // If image != nil, set cellImage to that image
    cell.cellImage.image = image;
}
image = nil;
[image release];

(ячейка класса (ячейка пользовательского табличного представления) также освобождает cellImage в методе dealloc).

Я понятия не имею, почему он протекает, но это определенно так. Изображения загружаются несколько раз в методе cellForRowAtIndexPath:. Изображение первых трех ячеек не просачивается (высота 130 пикселей, доступно все пространство).

Утечки не дает мне никакой другой информации, кроме этой UIImage allocated here in the code leaks.

Можете ли вы помочь мне разобраться? Спасибо:)

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

Код, который у вас есть, будет правильным, если изображение было @property. Вы можете освободить @property, выполнив self.property = nil из-за способа работы установщика. Сеттер освобождает старый объект и устанавливает значение ivar в значение. Чтобы это исправить, сначала нужно поставить [image release]. То, что здесь происходит, это то, что вы устанавливаете изображение на ноль, а затем вы по существу делаете [nil release]. Старое изображение просто где-то плавает. Чтобы это исправить, сделайте следующее:

[image release];
image = nil;
3 голосов
/ 03 июня 2010

Вы устанавливаете его на nil перед вызовом release. Таким образом, вы выпускаете nil вместо image.

Изменить с:

image = nil;
[image release];

до:

[image release];
image = nil;
0 голосов
/ 03 августа 2011

Битовая модификация кода

UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath 
        stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png",
        [postsArrayID objectAtIndex:indexPath.row]]]];

 if (image){
    cell.cellImage.image = image;
    [image release];
...