2010-10-06 10 views
0

Je crée/pousse mon ViewController, affiche quelques informations et retourne à mon RootViewController. Pendant que je navigue en arrière les accidents de l'application (EXC_BAD_ACCESS). Avec Instruments, j'ai découvert que le dealloc de mon ViewController est appelé, ce qui libère ma classe wrapper. Dans ma classe wrapper, la méthode dealloc est également appelée. Ce dealloc libère parsedJson (propriété conservée) et à droite, puis l'application se bloque. Il est étrange que le nombre de retards tombe de 1 à -1 malgré seulement un malloc et une libération a été faite.SBJsonParser: L'application se bloque si je ne conserve pas la valeur de retour

Si je conserve le résultat parsedJson retourné, l'application ne plante pas et je ne trouve pas de fuite. Je ne peux pas faire de release/autorelease parce que l'application se bloquerait à nouveau.

Avec NSZombieEnabled je reçois

* - [Communiqué CFDictionary]: message envoyé à l'instance désallouées 0x6d51aa0

Je reçois ce zombie après avoir fait un changement. Avant que j'utilise une propriété et Interface Builder pour mon contrôleur de vue et moi n'avons pas eu un accident, parce que le contrôleur de vue n'a pas été libéré immédiatement. Maintenant, je fais ceci:

MyViewController *myViewController = [[MyViewController alloc] init]; 
[[self navigationController] pushViewController:myViewController animated:YES]; 
[myViewController release]; 
myViewController = nil; 

Où est l'erreur? Je ne peux pas retenir parsedJSON sans une version. Je ne publie jamais parsedJson à l'exception du dealloc. La bibliothèque utilisée contient-elle une erreur?

Répondre

1

[JSONParser objectWithString:] renvoie un objet auto-publié. Si vous voulez le garder, vous devez le conserver - et c'est seulement à ce moment-là que vous devenez responsable de le libérer. Mais si vous ne l'avez pas conservé, ne le gardez pas et ne le relâchez pas.

Vous avez dit que vous utilisiez une propriété retain, mais avez-vous réellement utilisé la propriété (self.ivar = object) ou avez-vous directement accédé à la variable (ivar = object)? L'objet ne sera conservé que si vous utilisez la propriété.

+0

Je définis la propriété comme ivar = objet. Je n'ai pas réalisé ce fait, que je dois utiliser la méthode setter (self.ivar ou [self setIvar: myVariable]). Merci un million pour ça! – testing

0

Après mon retour de la valeur à mon autre méthode que je zéro parsedJSON

parsedJSON = nil; 

Donc, si rien ne parsedJSON obtenir dealloced se passe, parce qu'un message envoyer à zéro ne provoque pas l'application crash. Malgré que je n'ai pas trouvé la cause de la sur-version ...

Questions connexes