2009-04-11 6 views
0

Je reçois des sous-couches d'un CALayer avec cette accesseur propriété:@property (copie) - est-ce qu'une copie entière est faite?

// @property(copy) NSArray *sublayers 

NSArray* layer = mylayer.layer.sublayers; 

Étant donné que cette propriété utilise « copie », chaque fois que j'exécute simplement:

mylayer.layer.sublayers 

est une copie entière des sous-couches tableau étant fait pour moi? Si cela peut être mauvais, parce que je pourrais avoir une centaine de couches, et je ne veux définitivement pas en créer une énorme copie. Je cherche simplement à obtenir un compte et itérer à travers les couches existantes, le pointeur sur les couches existantes,

Merci

Répondre

2

Lorsque vous utilisez la déclaration « copie » et vous @synthesize la propriété, puis copiez est utilisé lorsque la propriété est définie.

Dans votre exemple, vous accédez uniquement à la valeur qui vous donne simplement un pointeur sur le tableau de sous-couches.

Here's a link à la documentation ADC sur ce point.

Mise à jour

  1. IIRC, le moteur d'exécution est assez intelligent pour savoir si l'objet est mis mutable. Si un objet immuable est transmis à la propriété, il est conservé et non copié.
  2. Dans certains cas, si vous transmettez un objet modifiable que vous souhaitez modifier, vous devez écrire votre propre paramètre qui appelle mutableCopy sur l'objet. Ceci est montré dans le documentation link que j'ai fourni.
+0

Ceci est correct - la copie ne se produit que lorsque vous affectez à la propriété (ou appelez SetSublayers :), pas lorsque vous l'utilisez. –

1

Je ne suis pas sûr que je comprends votre réponse Abizern alors laissez-moi vous dire ceci:

Si vous utilisez (copie) sur une propriété que vous allez faire une toute nouvelle copie de cet objet afin perdrions beaucoup de mémoire. Je ne sais pas pourquoi ils le font, ils pourraient simplement utiliser (en lecture seule) à la place s'ils veulent protéger les valeurs du changement. De plus, rappelez-vous que la plupart des classes de valeur sont immuables dans Obj-C, donc elles ne peuvent pas changer la valeur de toute façon.

+0

Comme j'ai compris le problème du PO, il craignait qu'il crée une copie du tableau des sous-traitants chaque fois qu'il accédait à la propriété. J'essayais de dire que la copie n'est utilisée que lors de la définition de la propriété. Obtenir la propriété renvoie juste un pointeur sur l'objet. – Abizern

+0

Ah, gotcha, merci pour la clarification. –

+0

La raison pour laquelle ils utilisent 'copy' est qu'ils veulent empêcher la modification du tableau en externe. Si elles utilisaient 'retain' au lieu de 'copy', vous pourriez passer un NSMutableArray à setSublayers: puis le changer derrière le calque. –