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 !
Réponses
Trop de publicités?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é.
- 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.
- 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;
}
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 :)