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".
Antworten
Zu viele Anzeigen?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;
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.
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 ).