J'ai besoin de copier en profondeur un objet personnalisé qui a ses propres objets. J'ai lu et je ne sais pas trop comment hériter de NSCopying et comment utiliser NSCopyObject.
objective-c
copy
ben
la source
la source
Réponses:
Comme toujours avec les types référence, il existe deux notions de «copie». Je suis sûr que vous les connaissez, mais par souci d'exhaustivité.
Vous voulez ce dernier. S'il s'agit de l'un de vos propres objets, vous devez simplement adopter le protocole NSCopying et implémenter - (id) copyWithZone: (NSZone *) zone. Vous êtes libre de faire ce que vous voulez; bien que l'idée soit de faire une vraie copie de vous-même et de la renvoyer. Vous appelez copyWithZone sur tous vos champs, pour faire une copie profonde. Un exemple simple est
la source
autorelease
pas, ou est-ce que je manque quelque chose icicopyWithZone:
répond à ces critères, il doit donc renvoyer un objet avec un nombre de rétention de +1.alloc
au lieu deallocWithZone:
puisque la zone a été transmise?allocWithZone
.copy
,mutableCopy
etcopyWithZone
, lié à l'une des réponses, est ici.La documentation Apple dit
pour ajouter à la réponse existante
la source
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
. Je suppose que cela n'est nécessaire que lorsque nous héritons d'une autre classe personnalisée qui implémentecopyWithZone
Je ne connais pas la différence entre ce code et le mien, mais j'ai des problèmes avec cette solution, alors j'ai lu un peu plus et j'ai trouvé que nous devions définir l'objet avant de le renvoyer. Je veux dire quelque chose comme:
J'ai ajouté cette réponse parce que j'ai beaucoup de problèmes avec ce problème et je n'ai aucune idée de pourquoi cela se produit. Je ne connais pas la différence, mais ça marche pour moi et peut-être que ça peut aussi être utile pour les autres :)
la source
Je pense que cette ligne provoque une fuite de mémoire, car vous accédez à la
obj
propriété through qui est (je suppose) déclarée commeretain
. Ainsi, le nombre de rétention sera augmenté par la propriété etcopyWithZone
.Je pense que cela devrait être:
ou:
la source
Il y a aussi l'utilisation de l'opérateur -> pour la copie. Par exemple:
Le raisonnement ici est que l'objet copié résultant doit refléter l'état de l'objet d'origine. Le "." l'opérateur pourrait introduire des effets secondaires car celui-ci appelle des getters qui à leur tour peuvent contenir de la logique.
la source