2010-11-23 4 views
1

Je l'ai utilisé [anArray retainCount] pour obtenir le nombre de conserver tableau .. (je sais que cela ne devrait pas être utilisé, mais je me sers juste pour apprendre à retenir notion)dans iphone comte conserver

Après mon code.


NSString *str = [[NSString alloc] initWithFormat:@"a,b,c,d"]; 
NSArray *anArray =[[NSArray alloc]init]; 
NSLog(@"Retain count: %i", [anArray retainCount]); 
anArray=[str componentsSeparatedByString:@","]; 
NSLog(@"Retain count: %i", [anArray retainCount]); 

sortie

Retain count: 2 
Retain count: 1 

je pense qu'il devrait être opposé mais ....

+0

["Qu'est-ce qui augmente le nombre de retenues d'un objet?"] (Http://stackoverflow.com/questions/1181010/what-increases-an-objects-retain-count) peut être utile. – jensgram

+0

Désolé, mais quand j'utilise ce code, les deux fois show show retenir le chiffre 1. Et c'est correct parce que seul l'objet Array doit libérer pour le tableau – Ishu

+0

En ce qui concerne la raison pour laquelle le nombre de retenues d'origine était de 2, personne ne le devine. (mais comme plusieurs personnes mentionnent que vous n'êtes pas censé dépendre de la valeur). Il pourrait être NSArray ajouté lui-même au pool autorelease? – seand

Répondre

7

S'il vous plaît ne vous une faveur et ne le font pas oeil à retainCount essayer d'apprendre comment fonctionnent les règles de gestion de la mémoire. Au lieu de cela, se référer à la sympathique Apple Memory Management Guide.

Dans vos exemples:

NSArray *anArray =[[NSArray alloc]init]; 

Vous avez attribué "unTableau" (en appelant alloc), vous êtes responsable d'appeler release.

anArray=[str componentsSeparatedByString:@","]; 

Maintenant, vous avez obtenu un nouvel objet (fuite de l'original, comme dit et dit). Cette fois, vous ne possédez pas l'objet (car componentsSeparatedByString n'a pas alloc ou copy dans son nom), vous ne devez donc pas le libérer.

Ne vous inquiétez pas de ce qu'est le retainCount; tendre à vos propres objets de tricotage et de libération que vous devriez et ne libérez pas d'objets que vous ne possédez pas.

+0

+1 pour en parler en termes de propriété d'objet plutôt que d'utiliser la terminologie obsolète "count count". – dreamlax

+0

vous voulez dire que le code suivant est correct? NSString * str = [[NSString alloc] initWithFormat: @ "a, b, c, d"]; NSArray * anArray = [[NSArray alloc] init]; [une version d'Array]; anArray = [str componentsSeparatedByString: @ ","]; // ne pas publier l'anArray maintenant – Saawan

+0

+1 ce serait +2 si vous aviez mentionné que 'new' vous donne aussi un objet que vous possédez et que j'ai été autorisé à voter deux fois. – JeremyP

1

La documentation indique que le nombre retain est peu susceptible de fournir toute information utile . C'est PAS un bon moyen d'en apprendre davantage sur les concepts de conservation et de libération.

+0

Cela devrait être un commentaire pas de réponse ..... – Saawan

+0

Poser une question si vous voulez une réponse. "Je pense que ce devrait être le contraire, mais ..." est une implication vague ... –

5

Cette ligne ... anArray = [str componentsSeparatedByString: @ ","];

Vous avez écrasé l'affectation d'origine de 'anArray' (créant ainsi une fuite). Dans la vraie vie, vous voudriez d'abord [une version d'Array]. Voilà pourquoi le retenir comte est retourné à 1.

+0

+1 pour écraser –

+0

+1 pour écraser – dreamlax

+0

+1 merci pour les années – Saawan