Frage

Ist eine dieser beiden Möglichkeiten zum Erstellen und initialisieren ein Objekt vorzuziehen?

MyClass oClass = [[MyClass alloc] init];
oClass.length = 5;
oClass.text = @"Hello";

oder eine Klassenmethode verwenden, die über den gleichen Code enthält aber sieht wie folgt aus:

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"];

Ich hasse es, wenn ich die Dinge sehe mehr als einen Weg gemacht, und ich habe keine Ahnung, ob man besser ist als die andere, oder warum!

War es hilfreich?

Lösung

Seien Sie nicht ein Hasser. : -)

By the way, ich nehme an, Sie meint:

( Edit: entfernt unnötige Abgüsse)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];

Der Grund für mehr init ... Methoden ist es für Entwickler einfacher zu machen, richtig initialisiert Instanzen zu erstellen. So zum Beispiel, wenn Sie feststellen, dass die Entwickler oft müssen Instanzen von MyClass mit einer Länge und Text erstellen, die Sie machen ihr Leben einfacher durch ein API bereitstellt, die sie, dass in einem Schritt zu tun erlaubt. Und wenn Sie feststellen, dass die Entwickler auch müssen häufig Instanzen von MyClass erstellen mit nur einem Text-String, können Sie auch eine -initWithText: Methode liefern.

Und wenn die auf diese Weise erstellt Instanzen häufig als temporäre Objekte verwendet werden (dh gespeichert nicht in Instanzvariablen oder statischen Variablen), können Sie auch eine Klasse bequeme Methode wie +myClassWithText: hinzufügen, die eine Autoreleased Instanz von MyClass kehrt initialisiert mit dem mitgelieferten Textzeichenfolge.

Wie zu denen man besser: es ist immer besser, ein Objekt vollständig zu initialisieren, wenn möglich, so dass, wenn das Objekt beiden Werte muss richtig initialisiert wird, verwenden Sie die Methode, die Sie beiden Argumente bereitstellen kann. Und wenn Sie Sie erstellen keinen Verweis auf die Instanz speichern müssen, verwenden Sie die Klasse bequeme Methode, um Ihren Code muss nicht mit der Speicherverwaltung befassen.

Andere Tipps

Wenn das Objekt ohne die Länge und Text unbrauchbar ist, dann könnte die zweite Option besser sein. Wenn diese Felder optional sind, dann ist die erste ist besser.

Aber ich glaube nicht, es ist die absolute Wahrheit auf diese Frage.

Wenn Sie eine Klasse mit vielen Eigenschaften ist es sehr unwahrscheinlich ist, sie alle in einer einzigen Code-Zeile zu initialisieren. Beide Wege funktionieren gut für mich.

Wenn ein initWithSomething: Methode zur Verfügung steht und Sie für diese Eigenschaften Anfangswerte zur Verfügung zu stellen, würde ich es immer nur vorziehen, weil es einfacher. Es wird auch immer noch mit unveränderlichen Versionen einer Klasse arbeiten.

Aber weder init-Methode ist von Natur aus „besser“. Klassen haben in der Regel ein oder zwei bezeichnet initializers und alle anderen nur diejenigen mit Standardwerten nennen - es gibt nicht unbedingt die Eigenschaften unberührt Instanz verlassen. Die Dokumentation für eine Klasse soll angeben, was seine initializers tun und das ist, der designierte initializer für die Klasse. Zum Beispiel [[NSDate alloc] init] verwendet NSDate designierten Initialisierer, initWithTimeIntervalSinceReferenceDate:, ein Datum Objekt zu erstellen, das aktuelle Datum und die Uhrzeit darstellt.

Im übrigen bedeutet dies auch, dass, wenn Sie eine Klasse sind Subklassen, müssen Sie nur die bestimmte Initialisierung außer Kraft setzen. Da die andere nur so nennen, sie Ihr neues Verhalten kostenlos.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top