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.
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. –
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. –