2011-01-08 17 views
0

Gibt es einen Unterschied zwischen folgenden Möglichkeiten zu init selbst?Über init-Frage

Erstens:

- (id)init { 
    self = [super init]; 
    if (self) { 

    } 
    return self; 
} 

Zweitens:

- (id)init { 
    if (self = [super init]) { 

    } 
    return self; 
} 

Ich mag zweite Möglichkeit nutzen selbst init. Aber ich sehe oft den ersten Weg, wenn ich eine neue Klasse durch Xcode erstelle, diese Codes werden automatisch generiert. Ich fürchte, der zweite Weg wird einige Fehler in einer Bedingung machen, die ich nicht kenne.

Antwort

4

Nein, sie sind gleich.

Die zweite Methode verpassten gerade die erste Zuweisung von self

Ein anderer Weg, die Sie stoßen könnten, ist dies:

- (id)init { 
    if (!(self = [super init])) { 
     return nil; // Bail! 
    } 
    // Further initialisation 

    return self; 
} 

Damit ist die außergewöhnlich gutem Zustand in der if Anweisung, und hält den Code dass Sie erwarten, normal (der Happy Path) näher am linken Rand zu laufen.

+0

Vielen Dank. – AechoLiu

2

In C und den meisten (wenn nicht allen) Sprachen sind diese beiden gleich.

Erste

 
a = b; 
if (a) {} 

Zweite

 
if (a = b) {} 

erste ist mit nur einer Zeile mehr.

Allerdings sind sie nicht gleich wie

 
if (a == b) {} 
+0

Vielen Dank. – AechoLiu

1

Sie sind gleichwertig und man kann sicher jeder von ihnen verwenden. Einige Leute ziehen nicht

if (self = [super init]) 

zu verwenden, weil es ein bisschen überlastet ist: es bedeutet ‚weisen Sie den Rückgabewert von [super init]-self und dann bewerten self als (boolean) Zustand‘.

Auf dem ersten Blick, eine, den Code falsch gelesen könnte, den Zuweisungsoperator = als der Gleichheitsvergleichsoperator ==, d.h. self Vergleich den vom [super init] zurückgegebene Wert‘ Interpretieren der nicht der Fall ist.

Dies kann besonders verwirrend für Programmierer sein, die neu in C sind. Nicht jede Programmiersprache erlaubt Zuordnungen in Ausdrücken, dh Zuordnungen müssen in einer separaten Anweisung sein.

+0

Vielen Dank. – AechoLiu

0

Beide sind funktionell äquivalent, aber die Verwendung von Zuweisungen, bei denen bedingte Ausdrücke erwartet werden, wird als schlechte Programmierpraxis entmutigt, weil es normalerweise zufällig ist, e.g:

if (myVar = 5) { 
    printf("The variable was 5\n"); 
} 

Wenn Sie tatsächlich schreiben bedeutete:

if (myVar == 5) { 
    ... 

jedoch die Objective-C-Code init in der Regel eine Ausnahme ist, weil es eine bekannte Sequenz ist und eine Menge wiederholt, so für Bequemlichkeit Einige Leute können wählen, die Zuweisung innerhalb des bedingten Ausdrucks zu schreiben.