Question

J'utilise un contrôleur UINavigationController et je ne parviens pas à libérer les objets lorsque je pousse une nouvelle vue. Je veux définir un objet sur le nouveau contrôleur avant de le pousser. La façon dont je le fais actuellement est la suivante:

OpenPageViewController *varOpenPageController = [[OpenPageViewController alloc] initWithNibName:@"OpenPageViewController" bundle:nil];
varOpenPageController.bookObj = bookObj;
[[self navigationController] pushViewController:varOpenPageController animated:YES];
//[varOpenPageController release];

Si je supprime la mise en commentaire de la dernière ligne, le programme se bloque lorsque je retourne dans mon contrôleur. J'ai aussi une autre question concernant quand et comment libérer un objet. Dans le bookObj, j'ai un tableau modifiable d'objets Page et je souhaite modifier le texte de l'objet de la page en cours. Je le fais par:

Page *pageObj = [[bookObj pagesArray] objectAtIndex:currentPage];
pageObj.page_Text = textView.text;
[[bookObj pagesArray] replaceObjectAtIndex:currentPage withObject:pageObj];
//[pageObj release];

Le programme se bloque si je supprime également le commentaire de la dernière ligne. Cela me permettra de naviguer en avant, mais lorsque je reviendrai en arrière et que j'essaierai d'avancer encore, cela se bloquera.

Autoreleasing les objets apportent des résultats similaires. S'il vous plaît aviser si vous le pouvez. Merci.

EDIT: Lorsque je publie le premier exemple varOpenPageController et que je lance le simulateur avec Leaks, le programme semble fonctionner correctement. Cependant, si je ne lance pas Leaks, il se bloque. Quelqu'un a-t-il une idée de la raison pour laquelle cela pourrait arriver? Merci.

Était-ce utile?

La solution

Il serait peut-être avantageux de lire le Document sur la gestion de la mémoire Apple . Le deuxième élément, vous n'avez pas besoin de libérer le pageObj car il ne contient qu'une référence à l'élément réel dans le tableau bookObj. Ce n'est pas l'élément réel si cela a du sens. Donc, ce que vous êtes réellement en train de faire, c’est de libérer l’élément réel du tableau. Ainsi, lorsque vous revenez en arrière et essayez d’y accéder, il n’y figure pas.

La règle de base est la suivante: ne publiez que ce que vous créez.

Autres conseils

Votre premier exemple d'application du contrôleur de vue sur le contrôleur de navigation est correct avec le relâchement. Si cela se bloque à votre retour, cela signifie probablement que la méthode dealloc d'OpenPageViewController a un problème, mais que quelque chose ne va pas car le contrôleur de navigation conserve votre contrôleur de vue et vous devez vous assurer de le relâcher après avoir appuyé (si vous avez alloué l'instance du contrôleur de vue comme vous l'avez fait dans votre code).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top