Normalement, vous faites une vérification comme celle-ci dans une méthode de mutateur parce que vous travaillez avec des objets qui doivent être release
d. Disons que vous avez une méthode mutateur sans que l'enregistrement:
- (void)setObject:(MyObject *)anObj
{
[obj release];
obj = [anObj retain];
}
Imaginer (pour une raison quelconque), vous avez un morceau de code comme celui-ci qui utilise cette méthode:
MyObject *o = [MyObject object]; // Auto-released
[anotherObject setObject:o];
[anotherObject setObject:o];
Sur la ligne 1, vous pouvez supposer o
a un nombre de retenue de 0 (puisqu'il est auto-libéré). Sur la ligne 2, o
a été passé à setObject:
, qui le conserve et le stocke dans la variable d'instance obj
. Étant donné que nous travaillons avec des pointeurs, o
et obj
pointent vers le même objet en mémoire, qui a maintenant un nombre de retenir 1.
On Line , vous passez le même objet -setObject:
à nouveau . Mais tout de suite dans cette méthode, vous publiez anObj
, qui est le même objet que o
et obj
point à! Cela signifie que o
, obj
et anObj
ont un nombre de retenues de . Lorsque vous définissez obj
sur [obj retain]
, vous faites pointer obj
vers un objet qui a déjà été publié. Ceci est évidemment mauvais, donc lorsque vous travaillez avec des méthodes mutator qui traitent des objets, vous devez toujours utiliser cette garde, qui vérifie efficacement si obj
et anObj
pointent vers le même objet en mémoire; s'ils le font, rien ne se passe.
Cependant, cette garde n'est pas nécessaire dans votre exemple, parce que vous passez un int
- pas un pointeur - et int
s, bien sûr, obtenir leur libération jamais (car ils sont pas des objets) .
Eh bien, si c'est déjà la même valeur, je ne vois pas pourquoi vous devriez le réinitialiser. – Garrett
IIRC, ceci est juste un guide de style.Cela vous évite d'oublier accidentellement d'appeler [release bodyMass] avant l'affectation. – Seth
Je peux voir pourquoi pour un objet (comme un NSString) parce que si vous ne testez pas là vous courez le risque de relâcher l'objet. Mais dans cette situation, il semble juste se résumer à la surcharge d'un «si» par rapport à la fréquence de réglage des valeurs en double. – fuzzygoat