Dans un setter de propriété synthétisé, le code fait quelque chose à peu près analogue à ce (nous aurons name
être le nom de la propriété, et _name
sera la variable d'instance à auquel il se réfère):
- (void) setName: (NSString *) newValue
{
if (newValue == _name)
return;
[newValue retain];
[_name release];
_name = newValue;
}
Maintenant, cela montre ce qui se passerait en fonction de votre déclaration de propriété ci-dessus. Selon les autres attributs possibles de cette propriété, cette fonction utiliserait soit [newValue copy]
au lieu de [newValue retain]
(si l'attribut 'copy' était spécifié), soit elle serait enveloppée dans un bloc @synchronized(self)
(si l'attribut 'nonatomic' était NOT fourni).
Je tiens également à noter que, depuis votre propriété fait référence à un NSString, qui met en œuvre le protocole NSCopying, vous devriez vraiment être en utilisant une copie plutôt que de retenir, à savoir:
@property (nonatomic, copy) NSString * name;
Cela provoquera le setter synthétisé à utiliser -copy
au lieu de -retain
, ce qui est plus sûr lorsque vous passez réellement un objet NSMutableString. Une chaîne immuable ne sera finalement conservée que par l'appel -copy
, alors qu'une chaîne mutable créerait une nouvelle copie immuable. Ne pas le faire signifie que la chaîne elle-même pourrait être changée après avoir été passée dans le setter, en changeant la valeur sans la connaissance de votre objet.
Même si vous voulez pouvoir modifier un NSMutableString, vous devez remplacer le setter synthétisé par un autre qui effectue une mutableCopy sur la nouvelle valeur. De cette façon, l'original est sûr, et vous pouvez changer votre copie de la chaîne si vous en avez besoin. – Abizern
Oui, et vous définissez également votre propriété en tant que NSMutableString.A noter également: vous ne pouvez pas vérifier si un NSString est vraiment un NSMutableString en utilisant
[str isKindOfClass: [NSMutableString class]]
, car NSString est un 'cluster de classe', ce qui signifie que vous obtenez réellement une instance d'une sous-classe NSString *, qui est également une sous-classe NSMutableString . Votre meilleur pari est d'utiliser-mutableCopy
, qui conservera si le récepteur est déjà mutable. –