(iphone) UIImageView setImage: утечки? - PullRequest
       12

(iphone) UIImageView setImage: утечки?

7 голосов
/ 10 января 2011

Я меняю изображение UIImageview с помощью [self setImage: newImage];

Похоже, что каждый раз, когда я делаю это с newImage, предыдущее изображение, похоже, не выпускается.
Какой правильный способ заменить изображение UIImageView?

Спасибо

Ответы [ 4 ]

9 голосов
/ 20 января 2011

Да, UIImageView setImage делает утечку!На самом деле, происходит утечка CGImage, а не UIImage (как показывает «распределение» инструмента)

Я использую BrutalUIImage вместо UIImage

@interface BrutalUIImageView : UIView {
    UIImage *image;
}

@property(nonatomic, retain) UIImage *image;

@end

@implementation BrutalUIImageView
@synthesize image;

- (void)setImage:(UIImage *)anImage {
    [image autorelease];
    image = [anImage retain];
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    [image drawInRect:rect];
}

- (void)dealloc {
    [image release];
    [super dealloc];
}

@end
6 голосов
/ 10 января 2011

UIImageView setImage: никогда не просачивается, если изображение, которое вы передаете, не высвобождается.

Ваш код не будет просачиваться, если вы назначаете автоматически выпущенное изображение для представления изображения, что-то вроде следующего.

UIImage *newImage = [UIImage imageNamed:@"sampleImage"];
[yourImageView setImage:newImage];

Но если вы размещаете изображение где-то, вы должны освободить его вручную.

0 голосов
/ 06 ноября 2013

Да UIImageView setImage действительно просачивается!

Если вы циклически перебираете кучу изображений с

   [yourImageView setImage:[UIImage imageNamed:@"sampleImage.png"]];

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

Правильный, или, по крайней мере, без утечек способ сделать это:

   NSString *thePath = [[NSBundle mainBundle] pathForResource:@"sampleImage" ofType:@"png"];
   UIImage *newImage =  [[UIImage alloc] initWithContentsOfFile:thePath];
   [yourImageView setImage:newImage];

Я подтвердил это в своем коде, так как мое приложение перебирало множество больших файлов изображений.

0 голосов
/ 23 июня 2011

Ваш класс BrutalUIImageVIew действительно интересен, но, рисуя изображение с использованием метода drawInRect: UIImage, я теряю прозрачные области моего файла PNG.

Знаете ли вы, как нарисовать изображение, сохраняя прозрачность PNG? (Конечно, не использовать UIImageVIew, который пропускает CGImage при вызове «setImage:»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...