/ / alloc, init und new in Objective-C [duplizieren] - Ziel-c

alloc, init und new in Objective-C [duplizieren] - Ziel-c

Ein Buch für iPhone-Programmierung instanziiert Klassen wie folgt:

[[Class alloc] init]

Ein anderes Buch über Objective-C macht es so:

[Class new]

Was ist der Unterschied?

Antworten:

70 für die Antwort № 1

Ursprünglich in Objective-C wurden Objekte erstelltmit neuem. Als sich das OpenStep / Cocoa-Framework entwickelte, entwickelten die Designer die Meinung, dass das Zuweisen des Speichers für ein Objekt und das Initialisieren seiner Attribute getrennte Anliegen sind und daher getrennte Methoden sein sollten (zum Beispiel könnte ein Objekt in einer bestimmten Speicherzone zugeordnet sein). So kam der Alloc-Init-Stil der Objekterstellung in Frage.

Grundsätzlich ist neu alt und fast - aber nicht ganz veraltet - Sie werden sehen, dass Cocoa-Klassen viele Init-Methoden haben, aber fast nie neue benutzerdefinierte Methoden.


72 für die Antwort № 2

+new ist wörtlich implementiert als:

+ (id) new
{
return [[self alloc] init];
}

Nicht mehr, nicht weniger. Klassen können es überschreiben, aber das ist sehr untypisch zugunsten von etwas wie +fooWithBar:.


13 für die Antwort № 3

Wie bereits erwähnt, gibt es bei defaut keinen Unterschied. Aber du kannst das überschreiben new Klassenmethode. Apple's Dokumentation hat ein paar Gedanken dazu.

nicht wie Zuordnen, Neu ist manchmal in Unterklassen neu implementiert, um sie aufzurufen eine klassenspezifische Initialisierung Methode [...] Oft Neu... Methoden werden mehr tun als nur Zuteilung und Initialisierung.


2 für die Antwort № 4

Es hängt von der Klasse ab, aber [Class new] ist wahrscheinlich eine bequeme Methode, die anruft [[Class alloc] init] im Inneren. Daher können Sie keine anderen Init-Methoden wie "initWithString" aufrufen.