2010-11-11 10 views
5

me puede construir un objeto UIImageView con myImageView = [[UIImageView alloc] initWithImage:image];¿Es seguro llamar a los inicializadores varias veces en el mismo objeto 'asignado'?

Siguiendo actividad de las aplicaciones que afectan a la pantalla, si quiero cambiar la imagen de la UIImageView. Puedo hacerlo al reasignarlo con myImageView.image = someNewImage. Sin embargo, esto no parece actualizar las dimensiones del marco. Puedo modificarlos manualmente, pero he observado en la práctica que llamar al [myImageView initWithImage:someNewImage] hace eso por mí y tiene la ventaja de ser terser.

Sin embargo, yo no estoy seguro si es oficialmente una violación del protocolo en Objective C para hacer varias llamadas a init métodos en un objeto construido por una sola alloc. No lo usaría a menos que fuera seguro (se garantiza que no se colgará ni provocará fugas). ¿Hay evidencia de que no es seguro?

Mi investigación hasta el momento ...

En este artículo se da el detalle general sobre 'alloc' y 'init' en los objetos

http://developer.apple.com/library/mac/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html

Esto se relaciona Así que la pregunta

Why are alloc and init called separately in Objective-C?

Este artículo de blog advierte proveedores de objetos que sus métodos init pueden llamarse varias veces como un efecto del proceso de inicialización.

http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/

+0

La entrada del blog de bbum discute + (void) initialize (inicialización de nivel de clase) y no - (void) init. –

Respuesta

7

-init está escrito asumiendo que sólo se llama una vez. Por ejemplo, -initWithImage citado en la documentación de Apple se citan es implementado como

- (id)initWithImage:(NSImage *)anImage { 
    ... 
    if (self) { 
     image = [anImage retain]; 
    } 
    return self; 
} 

Esto supone que el Ivar image no apunta a un objeto retenido. Si se llama dos veces, pierde image.

llamada -init... sólo una vez por alloc, y llame inmediatamente después -init...alloc mediante la combinación de ellos como de costumbre:

SomeClass* foo=[[SomeClass alloc] init...: ... ]; 

Nunca se debe separarlos, porque [anAllocedObject init...] podría devolver algo diferente de anAllocedObject.

1

No, init (o una de sus variantes) solo se debe llamar una vez en cualquier objeto, como explicó Yuji. En lo que respecta a su número UIImageView, creo que puede simplemente llamar al [imageView sizeToFit] después de asignar su nueva imagen y automáticamente cambiará el tamaño por usted.

Cuestiones relacionadas