L'objet a probablement été modifié après avoir été libéré
Je suis en train de travailler sur un projet sur l'iPhone. Je suis maintenant le lancement d'une nouvelle UIViewController à partir d'un autre UIViewController, puis basculer entre eux. Voici mon code.
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, c'est la deuxième fois que j'ai lancer le UIViewController, je veux le libérer pour éviter de causer des fuites de mémoire. Le Débogueur affiche
iGreen(916,0x3f60348c) malloc: erreur pour objet 0x130350: somme de contrôle incorrecte pour objet libéré - l'objet a probablement été modifié après avoir été libéré.
définissez un point d'arrêt dans malloc_error_break pour déboguer
C'est étrange car des codes similaires dans d'autres parties ne retourne pas d'erreur de ce type. De plus, j'ai essayé autorelease, mais le programme sera immédiatement crash et le Debugger me dit que je suis la modification finalisé couches.
J'ai travaillé sur le problème pour une nuit entière, et encore confus à ce sujet.
source d'informationauteur Stone | 2011-06-11
Vous devez vous connecter pour publier un commentaire.
Définir un point d'arrêt dans malloc_error_break à déboguer.
Le faire et après la backtrace.
Habituellement, cela signifie que vous avez endommagé la mémoire, mais il peut aussi signifier que vous avez une plus-sortie de l'objet. Essayez de Construire et d'Analyser, trop.
En dehors de fixer un point d'arrêt dans malloc_error_break, appuyez sur la Commande-6 dans xCode pour sauter les points d'arrêt d'onglet également activer la fonction malloc sida dans votre régime.
Aller à l'régimes de sélecteur, sélectionnez "Modifier le schéma de trouver" le "Run" de la cible et d'aller vers le "Diagnostic" de l'onglet. Ci-dessous la gestion de la mémoire permettent de dessin à main levée, les bords de la garde, la garde malloc et zombie objets.
Avec un peu de chance xCode va vous attraper par écrit à l'extérieur de votre mémoire allouée et de corrompre la mémoire.
C'est comme la surveillance d'un adulte pour traiter de la mémoire...
Comprendre le message d'erreur: c'est de dire qu'une chose continué à utiliser (et de modifier) l'objet après avoir libéré. Ce code permet de se libérer et de ne pas le modifier par la suite, mais vous devez vous demander à quoi d'autre pourrait éventuellement continuer à l'utiliser (sans savoir qu'il a déjà été libéré).
À chaque fois le code dans cet extrait de code s'exécute, il s'en dégage (libère) les checkinViewController, et alloue un nouveau, et de toute évidence, elle ne touche jamais le vieux. Mais qui d'autre peut avoir un pointeur sur l'objet ancien?
Peut-être d'autres code que vous avez écrit, et, éventuellement, [délégué fenêtre], qui obtient une référence par l'intermédiaire de "[[délégué fenêtre] addSubview:checkInViewController.vue];"? Espérons que ce dernier prend sa propre référence, sens de presse ne sera pas libre immédiatement.
Mais attention pour n'importe où vous voulez copier le pointeur sans l'ajout d'une référence. Si vous faites cela, quelque part, et puis d'ailleurs (comme l'extrait ci-dessus) quelqu'un appelle de presse sur le même pointeur, vous pouvez maintenant avoir un pointeur sur un objet qui a été libéré.
Il ya un couple de choses qui vont mal conception sage dans votre code. Le premier de votre communiqué de la checkInViewController sans enlever son point de vue à partir de ses superview (le cas échéant), puis vous retirez le rootTabBarController de vue de son superview, sans rien faire pour le contrôleur lui-même, et vous n'ajoutez pas de checkInViewController à la rootTabBarController ou la rootViewController propriété de la fenêtre, de sorte que c'est dans l'air (juste retenu par votre objet en cours). Ce qui se passe lorsque ce (actuel) de l'objet devient libérée, mais la vue de la checkInViewController reste en place (retenus par) sur la fenêtre?
Si vous relâchez votre checkInViewController mais son point de vue est toujours conservé par la fenêtre, il va probablement créer des problèmes...
Sur l'erreur, je pense qu'il y a quelque part une référence faible (non conservé) de votre objet qui agit sur lui après il est libéré.