2009-03-30 7 views
0

Supposons que j'ai une classe comme ceci:Dans copyWithZone :, dois-je utiliser zone pour tous les allocs ou juste pour l'objet retourné?

@interface SomeClass : NSObject<NSCopying> { 
    SomeOtherClass *obj; 
} 

Dans la définition de copyWithZone :, je fais ceci:

SomeClass *someCopy = [[SomeClass allocWithZone:zone] init]; 

Donc ma question est, si je veux faire une copie de obj, lequel d'entre eux est correct/recommandé?

option A:

objCopy = [obj copyWithZone:zone]; 

Option B:

objCopy = [obj copy]; 
+0

ou Option C: objCopie = [obj copyWithZone: [self zone]]; Pour que la copie soit allouée dans la même zone que l'appelant. Mais encore une fois c'est si vous utilisez des zones en premier lieu. – adib

Répondre

3

Si vous utilisez la gestion de la mémoire le comptage de références (non Garbage Collection), vous devez utiliser [obj copyWithZone:zone]. En outre, vous devez (dans les mêmes circonstances) utiliser +allocWithZone: au lieu de +alloc pour allouer les copies. Cela alloue de la mémoire pour les instances dans une zone de mémoire spécifiée (voir NSZone). Les développeurs peuvent utiliser une zone distincte s'ils vont allouer de nombreux objets qui ne seront plus nécessaires à peu près en même temps. La zone entière peut ensuite être récupérée en une seule opération avec NSRecylceZone, aidant à prévenir la fragmentation de la mémoire. En général, l'utilisation d'une zone privée n'est pas nécessaire (et elle nuit généralement aux performances, profilez votre code!). En supposant que le développeur souhaite une copie dans une zone particulière, je pense que vous supposeriez qu'ils voudraient toutes les instances liées dans la même zone.

Les méthodes -copy et +alloc appellent respectivement les méthodes -copyWithZone: et +allocWithZone:, en passant la zone par défaut.

+0

Y at-il une raison particulière - que se passe-t-il sous le capot? –

+0

Une zone est une zone à partir de laquelle vous allouez de la mémoire. L'idée est que vous pouvez faire tout un tas d'allocations connexes (objets Cocoa, tampons, etc.) d'une zone, puis libérer la zone au lieu de tous les objets qu'elle contient. En pratique, j'entends, cela ne vous apporte pas vraiment beaucoup. –

Questions connexes