0

J'ai posté quelques questions avant, en essayant de comprendre pourquoi je reçois un EXC_BAD_ACCESS, et je l'ai fait un peu de débogagevue étant libéré lors de l'utilisation en raison des avertissements de mémoire

Voir ici : Help debugging iPhone app - EXC_BAD_ACCESS

et:

Overreleasing here?

Alors, je pense que j'ai découvert ce qui se passe.

De mon journal, je me fais ceci:

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000f 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x00003ebc objc_msgSend + 20 
1 MyApp      0x0000378a -[PictureView clearPage] (PictureView.m:79) 

Au début, je pensais que le problème était un objet libéré envoyé un message dans la fonction « clearpage », cependant, puisque parler à un ami, je Je suis amené à croire que l'objet PictureView lui-même pourrait déjà être libéré.

Ceci est confirmé par ma sortie de l'enregistrement:

Fri Jan 8 20:28:32 unknown MyApp[2224] <Warning>: Picture View Unloaded 
Fri Jan 8 20:28:32 unknown MyApp[2224] <Warning>: Memory warning from Picture view 
Fri Jan 8 20:28:34 unknown MyApp[2224] <Warning>: Scaling image 
Fri Jan 8 20:28:36 unknown MyApp[2224] <Warning>: Attempting to save image to disk 
Fri Jan 8 20:28:37 unknown MyApp[2224] <Warning>: Saved file to: /var/mobile/Applications/065C0D37-95C1-41D4-98F0-16A3555682CD/Documents/MyImage1.jpg 
Fri Jan 8 20:28:37 unknown MyApp[2224] <Warning>: Clearing page 
Fri Jan 8 20:28:40 unknown ReportCrash[2225] <Notice>: Formulating crash report for process MyApp[2224] 
Fri Jan 8 20:28:41 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.yourcompany.MyApp[0xb8e1]) Job appears to have crashed: Bus error 

Alors, je suppose l'idée que j'utilise est déchargée après avoir reçu un avertissement de mémoire causé par le imagepicker ...

Et ma question est, comment puis-je empêcher cela de se produire? J'ai évidemment besoin d'appeler la méthode clearPage de PictureView, mais je ne peux pas si elle est déchargée.

Répondre

3

Est-ce que PictureView est conservé dans votre contrôleur (je suppose qu'il s'agit d'une sous-vue de la vue de votre contrôleur)? Si ce n'est pas retenu, alors vous avez une référence qui pendouille. Lorsque votre contrôleur de vue n'est pas le plus en avant et qu'il reçoit un message -didReceiveMemoryWarning, il libère par défaut son membre de vue. Si vous avez des pointeurs dans les sous-vues de cela, et ils ne sont pas conservés, vous finirez dans cette situation.

La première chose à faire est prépondérant -didReceiveMemoryWarning et appelant clearpage:

- (void) didReceiveMemoryWarning { 
    [myPictureView clearPage]; 
    myPictureView = nil; 
    [super didReceiveMemoryWarning]; 
} 
+0

Désolé, clearpage ne fait pas ce que le nom laisse deviner à. Il prépare simplement la vue pour la redessiner en effaçant ses sous-vues. PictureView est une vue extraite du rootviewcontroller: PictureView * picView = [[PictureView alloc] initWithNibName: @ "PictureView" bundle: nil]; \t [self.navigationController pushViewController: picView animé: OUI]; \t [version picView]; Dois-je libérer ceci ici? –

+0

Alors PictureView est un ViewController? Il semble que vous ayez un problème de pointeur qui pend. Vérifiez les prises assignées (par opposition à conserver). En outre, override didReceiveMemoryWarning et casser là; appelez l'hérité et assurez-vous que tous vos points de vente sont des valeurs «saines». –

+0

J'ai fait de PictureView une prise et je l'ai réglé sur (non atomic, retain) dans le rootviewcontroller. Malheureusement, ce crash ne se produit pas à chaque fois, donc c'est vraiment difficile à tester. Ça m'énerve maintenant :( –

Questions connexes