2011-01-10 5 views
7

Zmieniam obraz UIImageview według [self setImage: newImage];(iphone) UIImageView setImage: leaks?

Wygląda na to, że za każdym razem, gdy robię to za pomocą newImage, wcześniejsze zdjęcie nie wydaje się być zwolnione.
Jaki jest poprawny sposób na zastąpienie obrazu UIImageView?

Dziękuję

+1

Czy możesz dodać nieco więcej kodu? Jak utworzyć/wypełnić newImage? – Axel

Odpowiedz

6

UIImageView setImage: nigdy nie wycieka, chyba że zdjęcie, które przechodzą nie zostanie zwolniony.

Twój kod nie wycieknie, jeśli przypisujesz autoodtwarzany obraz do widoku obrazu, podobnie jak poniżej.

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

Ale jeśli przydzielanie obraz gdzieś, trzeba go zwolnić ręcznie.

+3

Robię zasadniczo sametowanie jak to, co robi twój kod. Ale "instrumenty" pokazują pamięć rosnącą za każdym razem, kiedy to robię. przechodzenie z "drzew wywoławczych" do "statystyk" w "przydziałach instrumentów" i powrót do "drzewek połączeń" pokazuje, że pamięć wraca do miejsca, w którym powinna być. może autoreleased obiekt nie jest poprawnie wyświetlany w czasie w instrumentach? – eugene

+0

Może być .. Nie jestem pewien ... Czy możesz opublikować kod, w jaki sposób tworzysz i przypisujesz obraz? – EmptyStack

+0

[UIImage imageNamed:] będzie buforował dane obrazu, więc może to być przyczyną "wycieku". –

9

Tak, UIImageView setImage nieszczelności! Właściwie przecieki CGImage, nie UIImage (jak wskazywał "alokacja")

używam BrutalUIImage zamiast 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 
0

Twoja klasa BrutalUIImageVIew jest naprawdę interesująca, ale rysując obraz przy użyciu UIImage „drawInRect: "metoda, tracę przezroczyste obszary mojego pliku PNG.

Czy wiesz, jak narysować obrazek, zachowując transparencję PNG? (Oczywiście, nie używając UIImageVIew, który przecieka CGImage podczas wywoływania "setImage:")

+0

Spróbuj ustawić 'self.opaque = NO;' w ** metodzie BrutalUIImageView init. –

0

Tak UIImageView setImage istotnie przecieki!

Jeśli cykl przez kilka obrazów z

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

widać na wykorzystanie pamięci instrumenty wzrasta. To wydaje się być pewnego rodzaju buforowaniem, ponieważ po na rowerze przez wszystkie obrazy zużycie pamięci pójdzie płasko.

Prawidłowe, a przynajmniej, non nieszczelny sposób to zrobić to:

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

ja zweryfikowany to na moim kodzie jak mój APP rowerze przez wiele dużych plików graficznych.

+0

To, co widzisz, nie jest przeciekiem UIImageView, ale buforowaniem w [UIImage imageNamed:] –