2010-07-25 13 views
46

Ein Buch für über iPhone-Programmierung diese Klassen wie instanziiert:alloc, init, und neu in Objective-C

[[Class alloc] init] 

Ein weiteres Buch über Objective-C tut es dies wie:

[Class new] 

Was ist der Unterschied?

+0

Was ist mit '[NSMutableDictionary Wörterbuch];' – abhi1992

Antwort

67

Ursprünglich in Objective-C wurden Objekte mit neuen erstellt. 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 also sehen, dass Cocoa-Klassen viele Init-Methoden haben, aber fast nie neue benutzerdefinierte Methoden.

+30

Können Sie zeigen oder anführen, wo + neu ist "fast, aber nicht ganz veraltet". Ich hätte gerne die Informationen, bevor ich mit Kollegen diskutiere. – acarlow

+2

Ich benutze es als eine Abkürzung, wenn alles, was ich tun will, 'Alloc' /' init' aufrufen soll. – Rivera

+0

Was ist mit [NSMutableDictionary Wörterbuch]; – abhi1992

2

Es hängt von der Klasse ab, aber [Class new] ist höchstwahrscheinlich eine Komfortmethode, die intern [[Class alloc] init] aufruft. Daher können Sie keine anderen Init-Methoden wie "initWithString" aufrufen.

+1

"Alloc" erstellt einen neuen Speicherort, aber initialisiert es nicht im Vergleich zu "neu". –

13

Wie bereits erwähnt, gibt es bei defaut keinen Unterschied. Sie können jedoch die Klassenmethode new überschreiben. Apple's documentation hat einige Gedanken dazu.

Im Gegensatz zu alloc, neuen ist manchmal neu implementiert in Subklassen eine klassenspezifische Initialisierung Methode [...] Oft neue ... Methoden mehr tun berufen als Just Zuweisung und Initialisierung.

+2

Ich sehe den Auszug nicht in Ihrem Link. Könnten Sie bitte Ihre Quelle aufrufen? – acarlow

+0

Offensichtlich hat Apple die Dokumente aktualisiert und diesen Absatz entfernt. Sie können Kopien von älteren Versionen im Internet finden (nicht sicher über das Urheberrecht ...) – user123444555621

70

+new implementiert wahrsten Sinne des Wortes als:

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

Nichts mehr, nichts weniger. Klassen können es überschreiben, aber das ist sehr untypisch für etwas wie +fooWithBar:.

Verwandte Themen