2009-09-30 9 views
6

En mi objeto de clase he definido una propiedad (nonatomic, retain) para UIImage. I asignado esta propiedad con una imagen cargada a través de¿Desea liberar una propiedad UIImage cargada a través de imageNamed?

[UIImage imageNamed:@"file.png"]; 

Si en algún momento quiero volver a asignar esta propiedad a otra imagen, debería tener que liberar la referencia antes?

Estoy confundido porque por la propiedad de retención sé que debería lanzarlo. Pero debido a que imageNamed: es un método conveniente (no usa alloc), no estoy seguro de qué regla aplicar aquí.

¡Gracias por la información!

Respuesta

2

La imagen se devuelve autorrellenada de acuerdo con las reglas de denominación. Asignarlo a una propiedad con un atributo de retención a través del colocador lo retendrá. Al asignar otra imagen a la propiedad a través del colocador, se liberará la imagen anterior y se conservará la nueva.

0

Desde el docs:

... si va a aferrarse a un objeto de imagen devuelto, debe conservar como lo haría con cualquier objeto de cacao.

La consecuencia es que si ya no desea conservarlo, debe liberarlo (suponiendo que lo haya conservado).

1

Cuando se define una propiedad con nonatomic & retain, se crea un colocador para usted que tiene este aspecto:

-(void)setImage:(UIImage*)newImage { 
    if (image != newImage) { 
    [image release]; 
    image = [newImage retain]; 
    } 
} 

Como se puede ver, se libera el valor anterior antes de contratar el nuevo valor.

En su caso particular, la imagen autorretraída devuelta por -[UIImage imageNamed:] se retendrá automáticamente cuando la asigne a la propiedad, y luego se liberará automáticamente cuando asigne otra imagen (o nil) a la propiedad.

0

Usted debe liberar a todos los objetos que estés de contención, sin embargo, cuando se define el objeto de la imagen, creo que el código debería tener este aspecto:

UIImage *img = [[UIImage imageNamed:@"file.png"] retain]; 
6

correcta, Florin ... pero por la discusión anterior , si uno está utilizando un setter para la propiedad que (ya sea a través de sintetizar, o manualmente) lo hace "retener", entonces no hay necesidad de retener extra.

En otras palabras, lo siguiente sería correcto (y libre de fugas de memoria), en mi humilde opinión, ¿estoy en lo cierto? Creo que esta fue la intención original de la pregunta ... y también me gustaría estar seguro. ;-) ¡Gracias!

@interface MyClass { 
    UIImage *myImage; 
} 
@property (nonatomic, retain) UIImage *myImage; 
@end 

@implementation MyClass 
@synthesize myImage; 

- (void) someMethod { 

    self.myImage = [UIImage imageNamed:@"foo.png"]; 
} 

- (void) someOtherMethod { 

    self.myImage = [UIImage imageNamed:@"bar.png"]; 
} 

- (void) dealloc { 

    self.myImage = nil; 
    [super dealloc]; 
} 
@end 
+0

Esto es correcto. usar 'self.myImage = someImage' llama al método setter, que lo conserva para usted. AND '[UIImage imageNamed:]' devuelve una imagen autorrellenada, lo que significa que no tiene que limpiarla después. –

Cuestiones relacionadas