2011-01-08 3 views
0

Existe-t-il une différence entre les méthodes suivantes pour init init?A propos de la question init

Première:

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

    } 
    return self; 
} 

Deuxième:

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

    } 
    return self; 
} 

J'aime utiliser la deuxième façon d'initialiser l'auto. Mais je vois souvent la première façon quand je crée une nouvelle classe par Xcode, il va générer ces codes automatiquement. J'ai peur que la seconde voie fasse des erreurs dans des conditions que je ne connais pas.

Répondre

4

Non, ils sont identiques.

La deuxième méthode est tout simplement manquant la première mission de self

Une autre façon vous pourriez rencontrer est la suivante:

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

    return self; 
} 

Cela met l'état d'exception dans la déclaration if, et maintient le code que vous vous attendez à exécuter normalement (le Happy Path) plus proche de la marge de gauche.

+0

Merci beaucoup. – AechoLiu

2

En C et la plupart (sinon toutes) langues, ces deux sont identiques.

Première

 
a = b; 
if (a) {} 

Deuxième

 
if (a = b) {} 

premier est juste en utilisant une ligne de plus.

Cependant, ils ne sont pas identiques à

 
if (a == b) {} 
+0

Merci beaucoup. – AechoLiu

1

Ils sont équivalents et vous pouvez utiliser en toute sécurité l'un d'eux. Certaines personnes préfèrent ne pas utiliser

if (self = [super init]) 

parce qu'il est un peu surchargé: cela signifie 'affecter la valeur de retour de [super init]-self, puis évaluer self comme condition (booléenne). À première vue

, on pourrait mal interpréter ce code, l'interprétation de l'opérateur d'affectation = comme étant l'opérateur relationnel de l'égalité ==, à savoir « comparer self à la valeur retournée par [super init] », qui n'est pas le cas.

Cela peut être particulièrement déroutant pour les programmeurs qui sont nouveaux dans C. Tous les langages de programmation n'autorisent pas les affectations dans les expressions, c'est-à-dire que les affectations doivent figurer dans une instruction distincte.

+0

Merci beaucoup. – AechoLiu

0

Les deux sont fonctionnellement équivalents, mais l'utilisation d'affectations où des expressions conditionnelles sont attendues est déconseillée en tant que mauvaise pratique de programmation, car elle est généralement accidentelle, e.g:

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

Lorsque vous avez réellement voulu écrire:

if (myVar == 5) { 
    ... 

Cependant le code d'initialisation Objective-C est généralement une exception car il est une séquence bien connue et répétée beaucoup, donc pour plus de commodité certaines personnes peuvent choisir d'écrire l'affectation dans l'expression conditionnelle.