objective-c - [[NSDictionary alloc] init]后引用计数是几
黄舟
黄舟 2017-04-21 10:57:37
0
1
453
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出来分别是几?为什么?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(1)
黄舟

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

.
NSDictionary *dictC =[[NSDictionary alloc] initWithObjectsAndKeys:@"1",@"two", nil];
NSLog(@"dictC retain count is %d",[dictC retainCount]);

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.

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