Je travaille sur un projet sur iPhone. Je lance maintenant un nouveau UIViewController à partir d'un autre UIViewController, puis basculer entre eux. Voici mon code.Objet a été probablement modifié après avoir été libéré
iGreenAppDelegate *delegate = [UIApplication sharedApplication].delegate;
if(checkInViewController) {
[checkInViewController release];
checkInViewController = nil;
}
checkInViewController = [[CheckInViewController alloc] initWithCheckpoint:checkpoint];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.8];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[delegate window] cache:YES];
[[delegate rootTabBarController].view removeFromSuperview];
[[delegate window] addSubview:checkInViewController.view];
[UIView commitAnimations];
Le problème est la deuxième fois que je lance le UIViewController, je veux le libérer pour éviter de provoquer la fuite de mémoire. Le Débogueur affiche
iGreen (916,0x3f60348c) malloc: erreur pour objet 0x130350: contrôle incorrect pour objet libéré - objet a probablement été modifié après avoir été libéré. définir un point d'arrêt dans malloc_error_break pour déboguer
Ceci est étrange parce que des codes similaires dans d'autres parties ne reviennent pas une telle erreur. De plus, j'ai essayé autorelease, mais le programme va se bloquer immédiatement et le débogueur dit que je suis en train de modifier les calques finalisés.
J'ai travaillé sur le problème pendant une nuit entière, et encore confus à ce sujet.
Par ailleurs, si je ne libère pas le viewcontroller, le programme fonctionne très bien, mais je ne pense pas que ce soit une bonne façon de le résoudre. Quelqu'un peut-il m'aider à trouver le problème? – Stone
Difficile de suivre ce qui se passe dans votre code à partir de cet extrait, mais généralement vous avez juste besoin d'allouer le contrôleur de vue, ajoutez-le à votre contrôleur de tabulation, puis relâchez le contrôleur. Le contrôleur de barre d'onglets conserve le viewcontroller pour qu'il reste en place. Il me semble que vous le libérez avant que le contrôleur de tabulation ne soit terminé. Peut-être que vous pouvez ajouter plus de code à cette question pour plus de clarté? –
pouvez-vous ajouter votre implémentation initWithCheckpoint? Aussi, avez-vous essayé de construire et d'analyser dans le menu Xcode? – AmineG