2008-11-05 4 views
4

Je suis assez familier avec les raisons de vouloir copier une propriété contre conserver. (Essentiellement l'argument de la valeur par rapport à la relation.Vous voulez presque toujours copier les chaînes, par exemple.)NSColor et NSGradient en tant que propriétés - une raison de copier?

Qu'en est-il de NSColor et NSGradient?

Ils sont tous les deux conformes à NSCopying, mais comme ils sont actuellement implémentés, ils sont immuables.

Pensées?

Répondre

3

Les sous-classes de NSColor et NSGradient affectées à vos propriétés peuvent ne pas être immuables ou référentiellement transparentes. Vous devez donc toujours utiliser la même logique pour déterminer la conservation ou la copie que pour tout objet ayant des sous-classes mutables couramment utilisées. Cependant, dans la pratique, il est peu probable que cela ait de l'importance la plupart du temps.

4

Les objets non modifiables implémenteront souvent leur méthode copyWithZone: en tant que return [self retain], car il est inutile de faire une copie séparée des données si elles ne changeront jamais. Cependant, ils doivent toujours implémenter la méthode pour être compatible avec tout ce qui attend la conformité NSCopying (par exemple, les clés NSDictionary). En ce qui concerne l'utilisation, je voudrais coller avec les mêmes modèles d'utilisation que les autres propriétés "valeur", et vous ne verrez aucune différence de performance, car ils vont probablement appeler retaincopy de toute façon. Cela vous couvre également pour des cas comme l'ajout d'une sous-classe mutable qui a une implémentation non triviale de NSCopying.

+0

Je crois que @brian et @louis ont des points valides. Néanmoins, en règle générale, je préfère 'copy' sur' retain' car cela évite la possibilité qu'un autre objet mute la valeur dans des circonstances inattendues. Ceci est d'autant plus vrai dans un contexte de multi-threading où l'utilisation d'objets immuables devrait être encouragée pour la sécurité des threads (pensez ici erlang). L'exception la plus notable à cette règle est quand j'ai besoin de garder une référence autour pour la liaison ou l'observation. – aLevelOfIndirection

Questions connexes