2010-11-11 13 views
5

mogę skonstruować UIImageView obiekt z myImageView = [[UIImageView alloc] initWithImage:image];Czy można bezpiecznie wywołać inicjalizatory wiele razy na tym samym obiekcie 'alloc'ed?

wyniku aktywności aplikacji wpływających na wyświetlacz, jeśli chcę zmienić obraz na UIImageView. Mogę to zrobić, zmieniając go na myImageView.image = someNewImage. Jednak nie wydaje się, aby zaktualizować wymiary ramy. Mogę modyfikować te ręcznie, ale zauważyłem w praktyce, że wywołanie [myImageView initWithImage:someNewImage] robi to dla mnie i ma tę zaletę, że jest terser.

Jednak ja nie wiem, czy to oficjalnie naruszenie protokołu w Objective C, aby kilka połączeń do init metod na obiekcie wybudowanym przez jednego Alloc. Nie użyłbym go, chyba że byłby bezpieczny (gwarantowany, że nie ulegnie awarii lub nie spowoduje wycieków). Czy istnieją dowody na to, że jest to niebezpieczne?

Moje badania do tej pory ...

Ten artykuł zawiera ogólne szczegółów o 'Alloc' i 'INIT' na obiektach

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

Wiąże SO pytanie

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

Ten artykuł na blogu ostrzega dostawców obiektów, że ich metody inicjujące mogą być wywoływane wiele razy jako efekt procesu inicjalizacji.

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

+0

Wpis blogu bbum omawia inicjalizację + (void) (inicjowanie na poziomie klasy) i nie - (void) init. –

Odpowiedz

7

nr

-init jest napisane przy założeniu, że jest ona wywołana tylko raz. Na przykład, -initWithImage cytowany w dokumentacji Apple ty cytowany jest zaimplementowany jako

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

ta zakłada, że ​​Ivar image nie wskazują na zatrzymanego obiektu. Jeśli zostanie wywołane dwa razy, wycieknie image.

połączeń -init... tylko raz na alloc i wywołać -init... natychmiast po alloc łącząc je jak zwykle:

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

Nigdy nie powinno się ich rozdzielić, ponieważ [anAllocedObject init...] może powrócić coś innego od anAllocedObject.

1

Nie, init (lub jeden z jego wariantów) powinien być wywołany tylko raz na dowolnym obiekcie, jak wyjaśnił Yuji. Jeśli chodzi o twój numer UIImageView, wierzę, że możesz po prostu zadzwonić pod numer [imageView sizeToFit] po przypisaniu nowego obrazu, który automatycznie zmieni jego rozmiar.

Powiązane problemy