2010-11-11 5 views
5

Ich kann ein UIImageView Objekt mit myImageView = [[UIImageView alloc] initWithImage:image];Ist es sicher, Initialisierer mehrere Male auf dem gleichen "allokierten" Objekt aufzurufen?

Nach Anwendungsaktivität konstruieren, um das Display zu beeinflussen, wenn ich das Bild auf der UIImageView ändern möge. Ich kann dies tun, indem ich es mit myImageView.image = someNewImage neu zuweisen. Dies scheint jedoch die Rahmenmaße nicht zu aktualisieren. Ich kann diese manuell ändern, aber ich habe in der Praxis beobachtet, dass das Anrufen [myImageView initWithImage:someNewImage] das für mich tut, und den Vorteil hat, terser zu sein.

aber ich, wenn es nicht sicher ist offiziell ein Bruch des Protokolls in Objective C mehrere Aufrufe init Methoden auf ein Objekt durch einen einzigen alloc konstruiert zu machen. Ich würde es nicht benutzen, wenn es nicht sicher ist (garantiert keinen Absturz oder Leckagen). Gibt es Beweise, dass es unsicher ist?

Meine Forschung so weit ...

Dieser Artikel allgemeine Details 'alloc' und 'init'

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

Dies bezieht Frage SO

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

gibt auf Objekte

Dieser Blogartikel warnt Lieferanten von Objekten, deren Init-Methoden als Auswirkung des Initialisierungsprozesses mehrfach aufgerufen werden können.

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

+0

Der Blogeintrag von bbum behandelt + (void) initialisieren (Initialisierung auf Klassenebene) und nicht - (void) init. –

Antwort

7

Nr

-init geht davon geschrieben, dass es nur einmal aufgerufen wird. Zum Beispiel zitierte -initWithImage in Apples Dokumentation zitiert Sie implementiert als

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

Dies setzt voraus, dass die Ivar image nicht auf eine beibehalten Objekt zeigt. Wenn es zweimal aufgerufen wird, leckt es image.

Anruf -init... nur einmal pro alloc und rufen -init... unmittelbar nach alloc von ihnen wie gewohnt Kombination:

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

Sie sollten sie nie trennen, weil [anAllocedObject init...] etwas anderes anAllocedObject zurückkehren könnten.

1

Nein, init (oder eine seiner Varianten) sollte nur einmal für jedes Objekt aufgerufen werden, wie Yuji erklärte. Soweit Ihr UIImageView Problem geht, glaube ich, Sie können einfach [imageView sizeToFit] nach Zuweisung Ihres neuen Bildes anrufen, und es wird automatisch die Größe für Sie ändern.

Verwandte Themen