То, что вы видите, это не утечка UIImageView, а кэширование в [UIImage imageNamed:]

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

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

Спасибо

 Axel10 янв. 2011 г., 09:41
Вы можете разместить немного больше кода? Как вы создаете / заполняете newImage?

Ответы на вопрос(4)

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

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

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

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

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

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

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

 Bjorn Roche09 окт. 2015 г., 18:18
То, что вы видите, это не утечка UIImageView, а кэширование в [UIImage imageNamed:]
Решение Вопроса

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

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

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

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

 EmptyStack11 янв. 2011 г., 04:39
Может быть .. Я не уверен, хотя .. Можете ли вы опубликовать код, как вы создаете и назначаете изображение?
 eugene10 янв. 2011 г., 15:08
я делаю по сути то же самое, что и ваш код. Но «инструменты» показывают увеличение памяти каждый раз, когда я это делаю. переход от «деревьев вызовов» к «статистике» в «распределениях инструментов» и обратно к «деревьям вызовов» показывает, что память возвращается туда, где и должна быть. может быть, автоматически выпущенный объект не отображается должным образом во времени в инструментах?
 Bjorn Roche09 окт. 2015 г., 18:16
[UIImage imageNamed:] будет кэшировать данные изображения, так что это может быть причиной утечки.

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

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

 Igor Kulagin14 авг. 2013 г., 14:27
Попробуй установитьself.opaque = NO; вBrutalUIImageView init метод.

Ваш ответ на вопрос