NSDictionary *dictA =[[NSDictionary alloc] initWithObjectsAndKeys:@"1",@"two", nil]; NSLog(@"dictA retain count is %d",[dictA retainCount]); NSDictionary *dictB =[[NSDictionary alloc] init]; NSLog(@"dictB retain count is %d",[dictB retainCount]);
问:NSLog出来分别是几?为什么?
Tout d'abord, deux sorties, la première doit être 1 et la seconde doit être . . . Non, de toute façon, il est généralement supérieur à 1.
.La raison est la suivante :
Après avoir initialisé une instance de NSDictionary, l'instance est immuable, ce qui signifie qu'une fois générée, les informations en mémoire sont corrigées. Afin d'économiser de la mémoire, Objective-C pointera tous ces pointeurs immuables de la même instance vers la même mémoire. Par conséquent, lorsque vous dictB initialise un NSDictionary vide, il ne crée pas réellement une nouvelle instance, mais pointe vers une instance existante dans l'historique, et le RC de cette instance est augmenté de 1.
L'objet que vous avez créé avec dictA pour la première fois ne semble pas avoir d'objets en double, il s'agit donc d'une nouvelle instance si vous faites cela
Ensuite, cela devrait être 2 une fois imprimé, ce qui est RC + 1 de dictA.
En conséquence, les instances Mutables ne connaîtront pas cette situation. Chaque fois qu'elles sont créées, il s'agit d'une nouvelle instance, car elle peut changer à tout moment au cours du cycle de vie.