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?

4voto

MurderDev Punkte 159

Ich bin sehr spät zu diesem Thema, aber ich möchte erwähnen, dass neu ist eigentlich unsicher in der Obj-C mit Swift Welt. Swift erstellt nur dann eine Standard-Init-Methode, wenn Sie keinen anderen Initialisierer erstellen. Der Aufruf von new bei einer Swift-Klasse mit einem benutzerdefinierten Initialisierer führt zu einem Absturz. Wenn Sie alloc/init verwenden, wird sich der Compiler ordnungsgemäß beschweren, dass init nicht existiert.

3voto

evdude100 Punkte 437

Nebenbei bemerkt: Ich persönlich verwende [Foo new] wenn ich möchte, dass etwas in init getan wird, ohne dass der Rückgabewert irgendwo verwendet wird. Wenn Sie den Rückgabewert von [[Foo alloc] init] irgendwo, dann erhalten Sie eine Warnung. Mehr oder weniger, ich benutze [Foo new] als Augenweide.

1voto

Mike Crawford Punkte 2100

Wenn new die Aufgabe für Sie erledigt, dann wird Ihr Code auch etwas kleiner. Wenn Sie sonst [[SomeClass alloc] init] an vielen verschiedenen Stellen in Ihrem Code, schaffen Sie einen Hot Spot in der new-Implementierung - d.h. in der objc-Laufzeit -, der die Anzahl Ihrer Cache-Fehlversuche reduzieren wird.

Wenn Sie einen benutzerdefinierten Initialisierer verwenden müssen, sollten Sie meines Wissens nach [[SomeClass alloc] initCustom] .

Wenn Sie das nicht tun, verwenden Sie [SomeClass new] .

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