Comment faire copier et mutableCopy s'appliquent à NSArray et NSMutableArray?
Quelle est la différence entre copy
et mutableCopy
lorsqu'il est utilisé sur un NSArray
ou un NSMutableArray
?
C'est ma compréhension; est-il correct?
//** NSArray **
NSArray *myArray_imu = [NSArray arrayWithObjects:@"abc", @"def", nil];
//No copy, increments retain count, result is immutable
NSArray *myArray_imuCopy = [myArray_imu copy];
//Copys object, result is mutable
NSArray *myArray_imuMuta = [myArray_imu mutableCopy];
//Both must be released later
//** NSMutableArray **
NSMutableArray *myArray_mut = [NSMutableArray arrayWithObjects:@"A", @"B", nil];
//Copys object, result is immutable
NSMutableArray *myArray_mutCopy = [myArray_mut copy];
//Copys object, result is mutable
NSMutableArray *myArray_mutMuta = [myArray_mut mutableCopy];
//Both must be released later
- Vous avez une erreur dans votre édition; ne sais pas si c'est une faute de frappe ou un malentendu. Dans le premier bloc de code, la variable myArray_imuMuta est attribué à partir de mutableCopy est mutable, pas immuable, comme votre commentaire indique.
- Merci, c'était une erreur, j'ai été de se confondre avec Xcode en disant: "Avertissement NSArray ne peut pas répondre à ajouter -addObject / -removeObjectAtIndex. Je vais changer myArray_imuMuta à NSMutableArray.
- s'il vous plaît arrêter les modifications au nom de "l'ARC de compatibilité" - voir cette méta post pour la raison.
InformationsquelleAutor fuzzygoat | 2010-01-04
Vous devez vous connecter pour publier un commentaire.
copy
etmutableCopy
sont définis dans différents protocoles (NSCopying
etNSMutableCopying
, respectivement), etNSArray
est conforme à la fois.mutableCopy
est défini pourNSArray
(et pas seulementNSMutableArray
) et vous permet de faire des mutable copie d'une origine immuable tableau:Résumé:
mutableCopy
être mutable, quel que soit le type d'origine. Dans le cas des tableaux, le résultat devrait être unNSMutableArray
.copy
être mutable!copy
ing unNSMutableArray
peut retour d'unNSMutableArray
, puisque c'est le nom de la classe d'origine, maiscopy
ing arbitraireNSArray
instance ne serait pas.Edit: relire votre code d'origine, à la lumière de la Marque Bessey la réponse. Lorsque vous créez une copie de votre tableau, bien sûr, vous pouvez toujours modifier l'original, indépendamment de ce que vous faites avec la copie.
copy
vsmutableCopy
détermine si le nouveau tableau est mutable.Edit 2: Fixe mon (faux) hypothèse que
NSMutableArray -copy
serait de retour d'unNSMutableArray
.Je crois que vous avez mal interprété comment copier et mutableCopy travail. Dans ton premier exemple, myArray_COPY est immuable copie de myArray. Ayant fait la copie, vous pouvez manipuler le contenu de l'original myArray, et affecte pas le contenu de myArray_COPY.
Dans le deuxième exemple, vous créez une mutable copie de myArray, ce qui signifie que vous pouvez modifier une copie de la matrice, sans affecter les autres.
Si je change le premier exemple d'essayer d'insérer/supprimer des objets de myArray_COPY, il échoue, juste comme vous le souhaitez.
Peut-être penser à une utilisation typique de cas d'aide. C'est souvent le cas de ce que vous pourriez écrire une méthode qui prend un
NSArray *
paramètre, et, essentiellement, les stocke pour une utilisation ultérieure. Vous pouvez faire cela de cette façon:...mais vous avez le problème que la méthode peut être appelée avec un NSMutableArray comme argument. Le code qui a créé le groupe peut manipuler entre le moment où le doStuffLaterWith: la méthode est appelée, et lorsque, plus tard, vous devez utiliser la valeur. Dans un environnement multi-thread application, le contenu de la matrice pourrait même être changé pendant que vous êtes à parcourir, il, ce qui peut causer certains intéressant de bugs.
Si vous au lieu de faire ceci:
..alors la copie crée un instantané du contenu de la matrice au moment de l'appel de la méthode.
La "copie" méthode retourne un objet créé par la mise en œuvre de NSCopying protocoles copyWithZone:
Si vous envoyez NSString une copie du message:
La valeur de retour sera un NSString (non mutables)
La mutableCopy méthode retourne un objet créé par la mise en œuvre de NSMutableCopying du protocole de mutableCopyWithZone:
Par l'envoi d':
La valeur de retour SERA être mutables.
Dans tous les cas, l'objet doit mettre en œuvre le protocole, signifiant qu'il va créer la nouvelle copie de l'objet et de vous le renvoyer.
Dans le cas de NSArray il y a un niveau supplémentaire de complexité en ce qui concerne profonde et peu profonde de la copie.
D'une copie d'un NSArray ne copie que les références aux objets du tableau d'origine et le placer dans le nouveau tableau.
Le résultat étant que:
Affectera également l'objet à l'indice 0 dans le tableau d'origine.
Une copie en profondeur sera réellement copier les différents objets contenus dans le tableau. De ce fait par l'envoi de chaque objet, le "copyWithZone:" message.
Modifiée pour supprimer mon hypothèse erronée sur mutable objet de copie
permettra de créer
anotherArray
qui est une copie deoldArray
à 2 niveaux de profondeur. Si un objet deoldArray
est un Tableau. Ce qui est généralement le cas dans la plupart des applications.Eh bien, si nous avons besoin d'un Vrai Copie en Profondeur que nous pouvons utiliser,
Cela permettrait de s'assurer que tous les niveaux sont réellement copiés en conservant la mutabilité de l'objet original à chaque niveau.
Robert Clarence D'Almeida,
Bangalore, En Inde.
Vous appelez addObject et removeObjectAtIndex sur le tableau d'origine, plutôt que la nouvelle copie de ce que vous avez fait. L'appel de copie vs mutableCopy seulement les effets de la mutabilité de la nouvelle copie de l'objet et non l'objet d'origine.
Pour le dire simplement,
Copie (dans les deux cas) signifie que vous obtenez un nouveau tableau "rempli" avec les références de l'objet du tableau d'origine (c'est à dire le même (d'origine) les objets sont référencés dans les copies.
Si vous ajouter de nouveaux objets à la mutableCopy, alors qu'ils sont uniques à la mutableCopy. Si vous supprimez des objets de la mutableCopy, ils sont supprimés du tableau original.
Pense que de la copie dans les deux cas, comme un instantané dans le temps de le tableau d'origine au moment de la création de la copie.
Assumer
B du contenu est NSDictionary objet n'est pas NSMutableDictionary, est-il juste?
Vous devez connaître le type de retour de la copie de ces choses et, tout en déclarant que le nouvel objet à laquelle sera affectée la valeur de retour doit être immuables ou mutables, sinon le compilateur va vous montrer l'erreur.
L'objet qui a été copié ne peut pas être modifiée à l'aide de la nouvelle,ils sont totalement deux objets différents maintenant.