2010-07-24 3 views
8

Je vois beaucoup de code comme celui-ci dans des échantillons et des talons qui génère XCode:parenthèses double dans le code exemple

if ((self = [super init])) { 
} 

Je ne suis pas clair sur l'intention de la double parenthèse dans le conditionnel.

Répondre

7

développiez @Anders commentaire, la question spécifique, il est de vous protéger contre va comme ceci:

if (foo = x) { do_something() }; 

90% du temps, c'est un bug. Vous vouliez dire foo == x. Mais 10% du temps, vous vouliez vraiment dire "assigner x à foo et ensuite tester la vérité". Le cas canonique de ceci est while (ch = getchar()). Mais le if (self = [super init]) est un autre bon exemple. Le compilateur suppose que de telles choses sont des erreurs et émet un avertissement à moins que vous ne disiez au compilateur que vous le vouliez vraiment en utilisant des doubles parenthèses.

Personnellement, je viens de le faire de cette façon:

self = [super init]; 
if (self != nil) 
{ 
    ... 
} 
return self; 

C'est une ligne supplémentaire, mais il garde les choses juste que petit peu plus claires lorsque l'appel init est longue. En outre, Aaron Hillegass, de la renommée de Big Nerd Ranch, a mis au défi plusieurs d'entre nous de trouver un cas dans lequel cette vérification self==nil comptait réellement. Les cas existent, mais ils sont incroyablement peu nombreux (vous pouvez ajouter self en tant qu'observateur NSObservation et vous ne voudriez pas qu'il soit nil dans ce cas). Prenez-le pour ce que ça vaut; Dans mon code personnel, je passe souvent la vérification nil, mais dans mon code professionnel cela fait partie de la norme de mon équipe.

En outre, pour une raison quelconque, Apple a ajouté une option gcc supplémentaire -Wmost qui désactive cet avertissement. Je suppose que quelqu'un n'a pas aimé taper les parenthèses supplémentaires. Cela me semble une mauvaise idée de l'éteindre.

2

juste pour éviter d'avoir un avertissement.

+0

et heureusement (modernes) les compilateurs émettent des avertissements. de nombreux bogues peuvent être introduits en utilisant accidentellement une affectation par rapport à l'égalité dans l'expression conditionnelle - ceux-ci ne devraient pas être négligés de manière triviale. –

+0

oui, objc quand il y a un avertissement ça pourrait être quelque chose de vraiment sérieux alors se débarrasser de ceux qui sont triviaux permet de repérer les méchants. –