2011-01-10 9 views
7

estoy cambiando la imagen de UIImageview por [self setImage: newImage];(iphone) UIImageView setImage: ¿fugas?

Parece que cada vez que lo hago con la nueva imagen, la imagen anterior no parece ser lanzada.
¿Cuál es la forma correcta de reemplazar la imagen de UIImageView?

Gracias

+1

¿Puedes publicar un código más? ¿Cómo se puede crear/poblar newImage? – Axel

Respuesta

6

UIImageView setImage: nunca se pierde, a menos que la imagen que está de paso no quede liberado.

Su código no tiene fugas, si está asignando una imagen autorrellenada a la vista de imagen, algo como lo siguiente.

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

Pero, si se están asignando la imagen en algún lugar, usted tiene que liberar manualmente.

+3

estoy haciendo esencialmente lo mismo que lo que hace tu código. Pero "instrumentos" muestra que la memoria aumenta cada vez que lo hago. seleccionando "árboles de llamadas" a "estadísticas" en "asignaciones de instrumentos" y de vuelta a "árboles de llamadas" muestra que la memoria vuelve a donde debería estar. ¿tal vez el objeto liberado automáticamente no se muestra correctamente a tiempo en los instrumentos? – eugene

+0

Puede ser ... No estoy seguro ... ¿Puede publicar el código de cómo está creando y asignando la imagen? – EmptyStack

+0

[UIImage imageNamed:] guardará en caché los datos de imagen, por lo que puede ser lo que está causando una "fuga". –

9

Sí, UIImageView setImage does leak! En realidad, las fugas CGImage, no UIImage (como instrumento muestra "asignación")

utilizo BrutalUIImage en lugar de 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

Su clase BrutalUIImageVIew es muy interesante, pero dibujando la imagen utilizando UIImage "drawInRect: "Método, pierdo las áreas transparentes de mi archivo PNG.

¿Sabes cómo dibujar la imagen, manteniendo la transparencia PNG? (Por supuesto, no usa UIImageVIew que filtra el CGImage mientras se llama a "setImage:")

+0

Intenta establecer 'self.opaque = NO;' en el método ** BrutalUIImageView init **. –

0

Sí UIImageView setImage de hecho tiene fugas!

Si se desplaza por un montón de imágenes con

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

se puede ver en el uso de memoria instrumentos cada vez mayor. Esto parece ser un tipo de almacenamiento en caché dado que después de pasando por todas las imágenes el uso de la memoria se mantendrá sin cambios.

El correcta, o al menos, la forma no gotea de hacerlo es:

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

Verifiqué esto en mi código como mi aplicación fue ciclos a través de una gran cantidad de grandes archivos de imagen.

+0

Lo que está viendo no es UIImageView con fuga, sino que está en caché en [UIImage imageNamed:] –

Cuestiones relacionadas