7 Stimmen

Macht es jemals Sinn, [init] außerhalb von [[alloc] init] aufzurufen?

Ich frage mich, ob [[alloc] init] nur eine Konvention ist oder ob die Trennung der beiden Anrufe eine breitere Anwendung findet. Ich frage mich zum Beispiel, ob die Leute jemals [init] (oder Freunde) auf ein bestehendes Objekt anwenden, um es zu "re-initialisieren".

7voto

bbum Punkte 161596

Die Konvention lautet Niemals Objekte neu initialisieren . Sie können dies in sehr begrenztem Umfang in Ihren eigenen Klassen tun, die NSObject untergliedern (oder einen neuen Root definieren), aber Sie sollten dies niemals mit einer Unterklasse einer anderen Klasse aus den System-Frameworks tun.

Wenn Sie Instanzen einer Klasse "wiederverwenden" wollen, dann stellen Sie Methoden für die Wiederverwendung über den vorgesehenen Initialisierer hinaus bereit. D.h. man könnte z.B.:

- (void) reset;

Oder:

- (void) resetWithNewState: (MyState *) aState;

5voto

drawnonward Punkte 52834

Konventionell wird die init-Familie nur verwendet, wenn sie sich gegenseitig anrufen. Zum Beispiel:

-(id) initWithSomething:(int)something {
  self = [super init];
  // use something
  return self;
}

-(id) init {
  return [self initWithSomething:3];
}

Man könnte ein Zombie-Objekt weitergeben, wenn init noch nie aufgerufen wurde, aber ich kann mir keinen guten Grund vorstellen, dies zu tun. Wenn Sie ein Objekt erstellen wollen, ohne den Typ zu kennen, übergeben Sie eine Klasse.

-(id) makeAnything:(Class)someClass {
  return [[someClass alloc] init];
}

Bearbeiten:

alloc garantiert, dass alle Mitglieder auf Null initialisiert werden, und viele init Methoden beruhen darauf. Aufruf von init mehr als einmal diesen Vertrag bricht.

3voto

zoul Punkte 99332

Eine interessante Frage. Ich persönlich würde es mir zweimal überlegen, bevor ich mich damit befasse. Es scheint geradezu um eine neue Fehlerquelle zu betteln, während es nichts Neues bringt, das man nicht auch auf eine sicherere Weise bekommen könnte. Vielleicht verstehe ich einfach nicht genug, was in alloc und init vor sich geht, um mit diesen Teilen zu spielen, aber ich habe die Erfahrung gemacht, dass "dummer" Code mich im Allgemeinen glücklicher macht ( KISS ).

2voto

AlBlue Punkte 21966

Wenn der Speicher stark begrenzt ist (wie bei einer iPhone-Anwendung), können Sie eine (oder mehrere) Instanzen "zuweisen" und dann wiederverwenden. Sie müssen jedoch auf Lecks achten, da Objekte, die in init gespeichert/erzeugt wurden, oft mit der "free"-Meldung freigegeben werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X