2010-07-20 4 views
1

Lorsque je crée un NSString avec initWithFormat, je reçois un conserver nombre de 1Objective-C: Juste un autre conserver question de comptage

-(NSString *)description 
{ 
NSString *descr = [[NSString alloc] 
initWithFormat:@"I am the description."]; 

NSLog(@"Count: %lu",[descr retainCount]); 

return [descr autorelease]; 
} 

Si j'utilise initWithString à la place que je reçois un nombre de 2.147.483.647

NSString *descr = [[NSString alloc] 
initWithString:@"I am the description."]; 

Il doit donc y avoir une différence entre ces deux méthodes en termes de gestion de la mémoire. Que se passe-t-il ici?

Répondre

4

comte d'abord, vous ne devriez pas attention à ce que Retain est, que si vous êtes bien équilibrer vos -init, -copy et -retain messages avec -release ou -autorelease messages. Cela étant dit, lorsque vous créez une instance NSString en analysant une chaîne de format, de la mémoire lui est allouée. Lorsque vous créez une chaîne en référençant une chaîne constante dans votre code, vous vous retrouvez avec un pointeur vers cette chaîne constante, et son nombre de rétention s'affichera généralement comme UINT_MAX. C'est un détail d'implémentation dont vous n'avez pas à vous soucier.

-1

@NSResponder/et le reste du monde /: non, ne pas équilibrer init, copier et conserver. NARC est la question, équilibre nouveau ..., alloc ..., retenir ... et copier ... messages est la réponse!

Salutations