2010-03-25 17 views
7

Ho un errore in cui la mia applicazione si è bloccata "EXC_BAD_ACCESS" quando ho premuto il tasto Indietro sulla mia barra di navigazione e la vista scaricata che aveva un MapKit (mapView) e utilizzato il Location Manager. Provato per giorni per correggere il bug e, infine, si avvicinò con una soluzione per tutti coloro che si imbatte in questo problema:MapKit/Location Manager interrompe l'app quando si scarica vista

Aggiungi questo codice al vostro dealloc

- (void)dealloc { 
    mapView.delegate = nil; 
    locationManager.delegate = nil; 

    [mapView release]; 
    [locationManager release]; 
} 
+0

Grazie, amico! La cosa strana è che non puoi riprodurlo nel simulatore. –

+0

Fornisci ulteriori dettagli di implementazione. Sembra un obj. è già stato rilasciato. A proposito, è buona abitudine rinunciare al delegato in dealloc. – kompozer

+0

Senza vedere i registri degli arresti anomali non è in grado di dirlo. Ma sembra che tu rilasci qualcosa due volte. prova ad aggiungere NSZombieEnabled, questo ti dirà se stai tentando di accedere a qualcosa che è già stato rilasciato in memoria. – CW0007007

risposta

0

ho avuto anche questo, :) E, sì , questa correzione è in realtà una correzione adeguata;

- (void)dealloc { 
    mapView.delegate = nil; 
    locationManager.delegate = nil; 

    [mapView release]; 
    [locationManager release]; 
} 

cosa succede dietro le quinte è questo:

  1. Hai colpito il backkey. Questo scarica e di conseguenza rilascia il controller che contiene mapView. Poiché è probabile che vi sia un solo riferimento al controller, sarà quindi deallocato.

  2. Il locationManager, tuttavia, è molto probabilmente ancora riferito a qualche parte nel funzionamento interno di Orizzonte.

  3. Se locationManager e/o mapView ora inviano una notifica al rispettivo delegato, stanno seguendo un puntatore non valido. Quale risulterà in un'eccezione EXC_BAD_ACCESS.

Sì: delegati che indicano se stessi è sempre una buona idea. Ho appena desiderato che Apple aggiungesse un po 'di automagic lì.

Problemi correlati