Dans la documentation Xcode pour NSCopyObject
, la section des considérations spéciales stipule:NSCopyObject considéré comme nuisible?
Cette fonction est dangereuse et très difficile à utiliser correctement. Il est utilisé dans le cadre de
copyWithZone:
par n'importe quelle classe qui peut être sous-classée, est fortement sujet aux erreurs. Sous GC ou lorsque vous utilisez Objective-C 2.0, la zone est complètement ignorée.Cette fonction est susceptible d'être abandonnée après Mac OS X 10.6.
Pourquoi est-il difficile à utiliser correctement? Il effectue une copie peu profonde (bit pour bit). Les objets ne sont pas copiés ou conservés. La documentation est assez claire à ce sujet.
Si je ne manque pas d'autres raisons, quelle est l'alternative préférée pour effectuer une copie superficielle d'un objet?
Edit:
Il y a des raisons valables de vouloir effectuer une copie superficielle. Un exemple: une classe peut avoir plusieurs variables d'instance, dont la plupart sont des types primitifs (entier, flottant) ou des objets intentionnellement non conservés pour éviter les cycles de retenue (délégués). Une copie superficielle utilisant NSCopyObject
copie tout cela dans une ligne de code sympa et auto-documentée. Les ivars restants qui doivent être comptés par référence peuvent être conservés ou copiés individuellement. L'alternative à ceci est d'assigner au nouvel objet en utilisant la syntaxe de pointeur (newObject->ivar = ivar
) ou de créer une méthode d'initialisation avec un nombre potentiellement grand d'arguments (un pour chaque ivar à copier). Ce dernier me semble particulièrement laid, mais je suppose qu'il n'a pas besoin d'être dans la tête et exposé au monde.
Oui, c'est très utile! La clé à emporter: 'NSCopyObject' va bousiller l'équilibre de retenue/libération pour les objets retenus, nécessitant des correctifs dans les sous-classes qui, dans des circonstances normales, seraient des erreurs. –