357 Stimmen

Verwendung von alloc init anstelle von new

Wenn ich Objective-C lerne und Beispielcode lese, stelle ich fest, dass Objekte normalerweise mit dieser Methode erstellt werden:

SomeObject *myObject = [[SomeObject alloc] init];

anstelle von:

SomeObject *myObject = [SomeObject new];

Gibt es dafür einen Grund, denn ich habe gelesen, dass sie gleichwertig sind?

302voto

Jeremy Stanley Punkte 5796

Hierfür gibt es eine Reihe von Gründen: http://macresearch.org/difference-between-alloc-init-and-new

Einige ausgewählte Beispiele sind:

  • new unterstützt keine benutzerdefinierten Initialisierungen (wie initWithString )
  • alloc-init ist eindeutiger als new

Die allgemeine Meinung scheint zu sein, dass man das verwenden sollte, womit man sich wohlfühlt.

145voto

radekEm Punkte 4435

Eine sehr alte Frage, aber ich habe spaßeshalber ein Beispiel geschrieben - vielleicht finden Sie es nützlich ;)

#import "InitAllocNewTest.h"

@implementation InitAllocNewTest

+(id)alloc{
    NSLog(@"Allocating...");
    return [super alloc];
}

-(id)init{
    NSLog(@"Initializing...");
    return [super init];
}

@end

In der Hauptfunktion beide Anweisungen:

[[InitAllocNewTest alloc] init];

et

[InitAllocNewTest new];

ergeben die gleiche Ausgabe:

2013-03-06 16:45:44.125 XMLTest[18370:207] Allocating...
2013-03-06 16:45:44.128 XMLTest[18370:207] Initializing...

52voto

Barry Wark Punkte 106328

+new ist gleichbedeutend mit +alloc/-init in Apples NSObject Umsetzung. Es ist höchst unwahrscheinlich, dass sich dies jemals ändern wird, aber je nachdem, wie paranoid Sie sind, können Sie die Dokumentation von Apple für +new scheint eine Änderung der Implementierung (und die Aufhebung der Äquivalenz) in der Zukunft zu ermöglichen. Aus diesem Grund, weil "explizit besser ist als implizit" und aus historischer Kontinuität, vermeidet die Objective-C-Gemeinschaft generell +new . Sie können jedoch in der Regel die jüngsten Java-Einsteiger in Objective-C daran erkennen, dass sie beharrlich die +new .

10voto

Brian Campbell Punkte 304982

Oftmals müssen Sie Argumente an init und Sie werden daher eine andere Methode verwenden, z. B. [[SomeObject alloc] initWithString: @"Foo"] . Wenn Sie es gewohnt sind, dies zu schreiben, gewöhnen Sie sich daran, es auf diese Weise zu tun und so [[SomeObject alloc] init] ist vielleicht natürlicher als [SomeObject new] .

10voto

user739711 Punkte 1802

Eine kurze Antwort ist:

  1. Beide sind gleich. Aber
  2. new' funktioniert nur mit dem Grundinitialisierer 'init' und wird nicht mit anderen Initialisierern (z.B. initWithString:) funktionieren.

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