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
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.
Le code ci-dessus crée théoriquement une copie superficielle
array
, mais en fait aucune copie ne se produit, une seuleretain
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 protocoleNSCopying
, il ne l'a intelligemment faitretain
qu'une seule fois sans en créer de nouveaux, donc la référence compte de.array
etarr2
deviennent tous deux 2, ce qui est quelque peu contre-intuitif.Notez qu'à ce moment
array
etarr2
pointent vers la même mémoire, ce qui peut être clairement vu en imprimant l'adresse du pointeur.Dans le code ci-dessus,
mutableCopy
renvoie unNSMutableArray
À ce moment,NSArray
n'a pas de chance, il crée simplement un nouvel objetNSMutableArray
honnêtement, etarray
pointe versNSArray
, <.> pointe vers learr2
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.
pour obtenir des résultats clairs et corrects
Au fait,NSMutableArray
Ce type de conteneur immuable ne peut pas voir l'effet souhaité.NSArray
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.