114 votes

Comment faire pour copier un objet en objective c

J’ai besoin profond de copier un objet personnalisé contenant des objets de ses propres. J’avez lu autour et je suis un peu confus quant à comment hériter NSCopying et l’utilisation de NSCopyObject. Pourrait quelqu'un m’aider ? Merci pour la lecture !

192voto

Adam Wright Points 31715

Comme toujours avec les types de référence, il y a deux notions de "copie". Je suis sûr que vous les connaissez, mais pour l'exhaustivité.

  1. Une copie bit à bit. En cela, nous nous contentons de copier la mémoire bit à bit - c'est ce que NSCopyObject. Presque toujours, ce n'est pas ce que vous voulez. Les objets internes de l'état, d'autres objets, etc, et, souvent, de faire des hypothèses qu'ils sont les seuls à la tenue des références à des données. Au niveau du bit copies briser cette hypothèse.
  2. Une profonde, copie logique. En cela, nous faisons une copie de l'objet, mais sans vraiment faire bit par bit - nous voulons un objet qui se comporte de la même à toutes fins et intentions, mais n'est pas (nécessairement) un mémoire-clone identique de l'original - l'Objective-C manuel de appels un tel objet "fonctionnellement indépendant" de l'original. Parce que les mécanismes pour la fabrication de ces "intelligents" les copies varie d'une classe à l'autre, nous demandons les objets eux-mêmes à leur exécution. C'est le NSCopying protocole.

Vous voulez que le dernier. Si c'est l'un de vos objets, vous avez besoin simplement adopter le protocole NSCopying et mettre en œuvre -(id)copyWithZone:(NSZone *)de la zone. Vous êtes libre de faire ce que vous voulez; si l'idée est de vous faire une vraie copie de vous-même et de le retourner. Vous appelez copyWithZone sur tous vos domaines, afin d'en faire une copie. Un exemple simple est

@interface YourClass : NSObject <NSCopying> 
{
   SomeOtherObject *obj;
}

// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
  // We'll ignore the zone for now
  YourClass *another = [[YourClass alloc] init];
  another.obj = [obj copyWithZone: zone];

  return another;
}

25voto

Saqib Saud Points 1536

Documentation d’Apple dit

Une version de la sous-classe de le copyWithZone : méthode doit envoyer le message à super tout d’abord, d’incorporer sa mise en œuvre, à moins que la sous-classe descend directement de NSObject.

pour ajouter à la réponse existante

22voto

Felipe Quirós Points 38

Je ne sais pas la diference entre ce code et le mien, mais, j’ai des problèmes avec cette solution, alors j’ai lu un peu plus et trouve que nous devons définir l’objet avant de le retourner. Je veux dire quelque chose comme

J’ai mis cette cause de réponse, j’ai beaucoup de problèmes avec cette question et je n’ai aucune idée de pourquoi !, je ne sais pas la différence, mais il travaille et peut-être peut être utile :)

7voto

horkavlna Points 977

Le bon tutoriel pour comprendre copy, mutableCopy et copyWithZone

3voto

Szuwar_Jr Points 137
<pre><code></code><p><code></code><code></code><em>conserver le comte</em> <code></code> .</p><p>Selon moi, qu'il devrait être :</p><pre><code></code></pre><p>ou :</p><pre><code></code></pre></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X