objective-c - NSArray *array = otherarray;是深拷贝还是浅拷贝?该怎么理解
PHPz
PHPz 2017-04-24 09:11:20
0
2
481

NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = array;
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);

结果是 1,1


NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array copy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);

结果是 2,2


NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array mutbaleCopy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);

结果是1,1

所以应该怎么理解???

PHPz
PHPz

学习是最好的投资!

répondre à tous(2)
PHPzhong
NSArray *arr2 = array;

Le code ci-dessus n'est ni une copie profonde ni une copie superficielle. Il s'agit simplement d'une affectation de pointeur, et ils pointent vers la même mémoire.


NSArray *arr2 = [array copy];

Le code ci-dessus crée théoriquement une copie superficielle array, mais en fait aucune copie ne se produit, une seule retain est effectuée.

C'est parce que NSArray est un tableau en lecture seule qui ne peut pas être modifié. Lorsqu'il a implémenté le protocole NSCopying, il ne l'a intelligemment fait retain qu'une seule fois sans en créer de nouveaux, donc la référence compte de. array et arr2 deviennent tous deux 2, ce qui est quelque peu contre-intuitif.

Notez qu'à ce moment array et arr2 pointent vers la même mémoire, ce qui peut être clairement vu en imprimant l'adresse du pointeur.


NSArray *arr2 = [array mutableCopy];

Dans le code ci-dessus, mutableCopy renvoie un NSMutableArray À ce moment, NSArray n'a pas de chance, il crée simplement un nouvel objet NSMutableArray honnêtement, et array pointe vers NSArray , <.> pointe vers le arr2 nouvellement créé, donc le nombre de références est égal à 1. NSMutableArray


Retour à la copie profonde et à la copie superficielle. Pour un conteneur, si les objets dans le conteneur ne font qu'augmenter le nombre de références lors de la copie, alors il s'agit d'une copie superficielle, sinon, si un nouvel objet est créé pour chaque objet, alors il s'agit d'une copie superficielle. est une copie profonde.

Le questionneur devrait essayer d'utiliser

pour obtenir des résultats clairs et corrects NSMutableArray Ce type de conteneur immuable ne peut pas voir l'effet souhaité. NSArray

Au fait,

de NSMutableArray est une copie superficielle. copy

洪涛

En passant, les points d'arrêt, le débogage LLDB ou l'impression et l'observation des adresses mémoire peuvent nous aider à mieux comprendre le mécanisme ici.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal