2010-10-11 29 views
1

donc mon code va comme ceci:Comment réparer étrange retain count (1 init - 3 retaincount)? + Modifier: problème dealloc

ArticleControllerController *ac = [[ArticleControllerController alloc] init]; 
ac.categoryIndex = idx; 
NSLog(@"acc retain: %d", [ac retainCount]);   
[app.nav pushViewController:ac animated:NO]; 
NSLog(@"acc retain: %d", [ac retainCount]);   
[ac release]; 
NSLog(@"acc retain: %d", [ac retainCount]);  

Et je reçois:

[2649:207] acc retain: 1 
[2649:207] acc retain: 3 
[2649:207] acc retain: 2  

Comment résoudre ce gâchis? Je ne comprends pas ce que je fais de mal et cette partie provoque parfois un plantage de l'application en raison d'une mémoire insuffisante.

Édition: problème connexe. Par conséquent, la situation est la même que celle définie ci-dessus, mais le problème est que la méthode dealCoc d'ArticleControllerController n'est jamais appelée.

Plus code:

- (void) navigateToNewsCategoryByIndex:(int)idx { 
[app.nav popViewControllerAnimated:NO]; 

currentMode = MODE_ARTICLE; 
ArticleControllerController *ac = [[ArticleControllerController alloc] init]; 
ac.categoryIndex = idx; 
[app.nav pushViewController:ac animated:NO]; 
[ac release]; 
return ;   

}

Si cette méthode se répète plusieurs fois ArticleControllerController crée d'énormes quantités de divers éléments d'interface, mais sa méthode dealloc ne les libère (conservent le nombre va jamais à zéro), donc je pense que c'est le problème de mémoire-crash que j'essaie de résoudre depuis quelques jours maintenant.

Qu'est-ce qui se passe avec ça? Puis-je faire quelque chose de plus pour résoudre ce problème?

Répondre

2

Cela me semble bien. Après l'avoir créé, 'ac' a un nombre de retenues de 1 qui est correct. Ensuite, vous le poussez à app.nav et là encore deux retenues sont comptées ce qui est bien. C'est la responsabilité de cette classe de libérer tout ce qu'elle retient. Enfin, vous libérez l'instance que vous avez créée et le nombre de retenue diminue à 2. Mais ces deux comptes ne sont pas votre responsabilité, c'est app.nav. C'est pourquoi vous ne devriez pas vraiment vous soucier de l'impression de retainCount car cela peut sembler bizarre quand vous ne savez pas ce qui se passe dans les coulisses d'une autre classe.

Tout ce que vous devez faire est une version pour chaque alloc et vous avez fait cela

+0

merci beaucoup! Si ce n'est pas trop demander, pourriez-vous jeter un oeil à mon édition - je pense que j'ai un énorme problème lié à la libération complète de mon contrôleur (je suppose que son nombre ne retombe jamais à zéro et très mal avec la mémoire de l'application) . – sniurkst

+0

Vous ne devriez vraiment pas poser une nouvelle question dans un ancien, surtout après avoir accepté une réponse :) Rollback votre question et poster un nouveau avec avec ce problème AUTRE et je serai heureux de jeter un oeil – willcodejavaforfood

+0

Merci d'avoir éclairci cela:) Ici, c'est: http://stackoverflow.com/questions/3905702 – sniurkst