2010-08-10 4 views
4

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.

Répondre

2

Peut-être que vous trouverez cet article utile:
http://robnapier.net/blog/implementing-nscopying-439

+0

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

1

Vous ne devriez pas faire une copie superficielle n'impliquant pas la retenue/libération correcte. Période.

+1

De toute évidence, mais la fixation de ces références est au développeur. Votre réponse ne répond pas à ma question de savoir pourquoi 'NSCopyObject'" est dangereux et très difficile à utiliser correctement. " –

Questions connexes