Copie en profondeur et la Copie Superficielle
J'ai lu la réponse de la différence entre la copie et la copie superficielle de la poste, Quelle est la différence entre une copie et une copie? . Maintenant j'ai un peu de doute que lorsque l'on fait une copie par
newArray = [NSmutableArray arrayWithArray:oldArray];
la nouvelle matrice de point de oldArray. (À partir de la figure). Maintenant ce qui se passe quand je supprimer l'objet de newArray? Comme à partir de la figure, il faut supprimer un élément à partir de oldArray trop !!! Il semble que
newArray = oldArray
est une copie superficielle et newArray = [NSmutableArray arrayWithArray:oldArray];
est copie en profondeur. Est-il juste?
newArray = oldArray n'est pas une copie. C'est juste une deuxième variable qui pointe sur la même matrice.
À l'aide de
C'est un moyen de copier la matrice de copie en profondeur stackoverflow.com/a/647269/1189448
J'ai trouvé cette bonne réponse à la copie réelle profondeur copie stackoverflow.com/a/15040786/1189448
À l'aide de
arrayWithArray:
, vous avez un nouveau array référencement sur les mêmes objets.C'est un moyen de copier la matrice de copie en profondeur stackoverflow.com/a/647269/1189448
J'ai trouvé cette bonne réponse à la copie réelle profondeur copie stackoverflow.com/a/15040786/1189448
OriginalL'auteur rakeshNS | 2012-03-28
Vous devez vous connecter pour publier un commentaire.
newArary = oldArray
n'est pas une copie. Vous vous retrouvez avec deux pointeurs pointant vers le même emplacement mémoire.newArray = [NSMutableArray arrayWithArray:oldArray];
est une copie. Vous vous retrouvez avec deux tableaux distincts, donc si vous avez été de supprimer ou d'ajouter des éléments d'un tableau, il ne serait pas affecter l'autre tableau. Cependant, la éléments dans les deux tableaux sont identiques. Si le premier élément deoldArray
ont été unNSMutableDictionary
et l'ajout de la clé, vous pouvez voir le changement sur le premier élément denewArray
ainsi (car ces deux objets sont les mêmes).Faire une copie en profondeur, vous devez faire un nouveau tableau, et chaque élément de la nouvelle matrice serait une copie de l'élément correspondant de l'ancien tableau. (Oui, cette définition est récursive).
OriginalL'auteur yuji
Tout d'abord,
NSArray
's n'avez pas une copie en profondeur de la fonction. Cependant, vous pouvez faire une copie de fonction en procédant comme suit:Deuxième de tous,
newArray = oldArray
ne pas copier le tableau. Il fait tout simplementnewArray
point de la matrice queoldArray
points.Troisième,
+arrayWithArray:
fait une copie de la matrice, de la signification des objets individuels ne sont PAS copiés.[ret addObject:val];
Je pense que
[ret addObject:[val copy]]
est une fuite de mémoire en supposantNSCopying
est adopté selon Apple docs (copyWithZone:
retourne un objet qui est implicitement retenue par l'expéditeur).Suppose ARC (automatic reference counting) est utilisée dans ce cas.
c'est en effet correcte.
[ret addObject:[val copie]]; copie de chaque élément dans le tableau d'origine superficielle. alors si j'ai un tableau de tableaux à l'aide de votre méthode (propriétédeepcopy) je vais finir avec un nouveau tableau à l'intérieur des baies peu profondes copié.ce qui est faux n'est-ce pas.
OriginalL'auteur Richard J. Ross III
Vous pouvez également appeler
[[NSArray alloc] initWithArray:arraytoBeCopied copyItems:YES];
OriginalL'auteur Gomfucius
En Objective-C "Copie" mot-clé juste à l'augmentation de la "Conserver le Comte" de l'objet. Donc ne les utilisez que de "Copier" ne sera pas effectuer une copie.
Mais quand nous faisons un changement dans l'objet, puis Objective-C permet de créer une copie de l'objet original à l'époque.
S'il vous plaît corrigez-moi si je me trompe.
Grâce
Vous pouvez le trouver dans la documentation d'apple. Merci.
Vraiment? Parce que quand je regarde la documentation, je trouve que NSObject dit que la copie est un raccourci pour copyWithZone:, qui doit être mis en œuvre par les sous-classes qui souhaitent activer la fonction selon le NSCopying protocole. Qui précise que CopyWithZone crée un nouvel objet avec des propriétés identiques -- pas une augmentation de conserver le comte. En outre, Apple a explicitement désactivé toute utilisation de conserver compter depuis l'ARC a été ajouté. Donc, en disant: "copie" juste des augmentations de conserver compter sur un objet est flat-out faux, peu importe comment vous le couper.
developer.apple.com/library/mac/documentation/cocoa/conceptual/...
Je suis désolé de ne pas l'état de ma position plus clairement: je ne suis PAS de vous disputer avec votre deuxième paragraphe. Qui, autant que je puisse en dire, est correcte (même si, comme la documentation lien vers le souligne, il ne produit pas un "vrai" copie en profondeur, car il ne fera que descendre à un niveau plus profond -- de l'OMI, une faille). Je dis très spécifiquement avec votre premier paragraphe. "Copie" n'est, en fait, renvoyer une nouvelle instance de la classe. C'est juste que le contenu de cette classe sont des références à l'ancien objets, plutôt que des copies.
OriginalL'auteur iPhoneBuddy