2.0 Rendre un objet copiable – NSCopying

Les copies d'objets en Objective-C

NSCopying : rendre un objet copiable en Objective-C

En Objective-C par défaut les objets ne sont pas copiables. Ceux-ci étant représentés par des pointeurs, l’utilisation de l’opérateur = ne permet que la copie d’adresses.

// allocation d'un premier objet
LTMPoint * p1 = [[LTMPoint alloc]init];

// allocation d'un second objet
LTMPoint * p2 = [[LTMPoint alloc]init];

// Copie de l'adresse de l'objet en gras ci-dessus dans le pointeur p1
p1 = p2;

Ici p1 = p2; copie d’adresse contenue dans le pointeur p2 dans p1 : pas de copie d’objet.

Alors comment copier l’état d’un objet dans un autre objet du même type ?

Rendre copiable un objet

Soit la classe suivante (non copiable) :

Header

@interface LTMPoint : NSObject

    @property (nonatomic) double x;
    @property (nonatomic) double y;

    -(id)init;
@end

Implémentation

@implementation LTMPoint
    -(id)init {
        self = [super init];
        _x = 0.0;
        _y = 0.0;
        return self;
    }@end

Modification du code de la classe (pour rendre l’objet copiable)

En Objective-C pour rendre la classe copiable on utilise le protocole NSCopying.

@interface LTMPoint : NSObject <NSCopying>
    @property (nonatomic) double x;
    @property (nonatomic) double y;

    -(id)init;
@end

@implementation LTMPoint
    -(id)init {
        self = [super init];
        _x = 0.0;
        _y = 0.0;
        return self;
    }

    -(id)copyWithZone:(NSZone *)zone {
        LTMPoint * p = [[[self class] allocWithZone:zone] init];
        p.x = _x;
        p.y = _y;
        return p;
    }
@end

Pour rendre le point copiable il faut 2 conditions :
1. Que la classe adhère au protocole NSCopying
2. Implémenter le message copyWithZone:

Le paramètre zone envoyé en paramètre représente la zone à copier.

La formule [[[self class] allocWithZone:zone] init]; permet donc de créer une copie de l’objet entrant. On retourne ce nouvel objet qui représente la copie.

Comment lancer la copie de l’objet ?

Soit le code suivant :

    // Use case 1
    LTMPoint * p1 = [[LTMPoint alloc]init];
    p1.x = 1.2;
    p1.y = 2.3;
    LTMPoint * p2 = [p1 copy];

Le message [p1 copy] permet de créer une copie du point, retourné ici dans le pointeur p2.

Voilà est l’article est terminé, si vous souhaitez partager celui-ci utilisez les boutons ci-dessous.

Catégories
0 Comments
0 Pings & Trackbacks

Laisser un commentaire