Objective-C "messaggio inviato all'istanza deallocata 0x5633b0"
-
03-07-2019 - |
Domanda
Sembra che stia succedendo un rilascio troppo zelante nella mia app obj-C - ricevendo un messaggio di errore
" - [rilascio myobj]: messaggio inviato all'istanza deallocata 0x5633b0 "
. Conosco la classe dell'istanza dell'oggetto che causa il problema, ma questa classe viene utilizzata ovunque per creare molte istanze.
Il mio pensiero è che potrei mettere un po 'di registrazione nel metodo init della classe per registrare qualunque cosa " 0x5633b0 " corrisponde a quale dovrebbe aiutarmi a rintracciare dove l'istanza viene creata.
Che cos'è esattamente " 0x5633b0 " ed è possibile accedere a quel valore nel codice per registrarlo?
Grazie.
Soluzione
0x5633b0
è probabilmente l'indirizzo dell'oggetto in questione (il valore di self
). Puoi usare NSLog
o printf
con % p
per stamparlo.
Altri suggerimenti
Ciò che ha funzionato meglio per me quando mi sono imbattuto in problemi simili di recente è stato il seguente:
-
In Progetto- > Modifica eseguibile attivo - > Scheda Argomenti - > Ambiente sezione variabili Ho aggiunto e impostato su
YES
le seguenti variabili:NSAutoreleaseFreedObjectCheckEnabled
,NSZombieEnabled
eNSDebugEnabled
. -
Nel menu Esegui, ho selezionato Abilita Guard Malloc .
Con queste impostazioni il debugger ha fornito ulteriori suggerimenti su cosa non va nel mio codice.
(Ho trovato questi suggerimenti qui )
Buona fortuna, Ori
0x5633b0
è probabilmente l'indirizzo dell'oggetto deallocato (il valore di myobj
). Puoi usare NSLog
o printf
con % p
per stamparlo.
Puoi anche usare il profiler degli strumenti per trovare l'oggetto deallocato.
1. Avvia il profiler:
2. Seleziona " Zombi " e avvia il profiler.
3. Fai clic sul simulatore fino a quando non raggiungi il " caso di errore deallocato "
Nel debugger, digita simbolo info 0x5633b0
e otterrai qualche indicazione su quale oggetto sia. Un'altra cosa che potrebbe essere utile è backtrace
che ti darà una traccia dello stack. Tutto sommato, questa voce del blog ha alcuni < forti> ottimi suggerimenti .
puoi anche aggiungerli alle variabili di ambiente:
MallocStackLoggingNoCompact 1
e scrivi nella console di gdb:
info malloc-history < incolla-indirizzo-qui >
Riferimento: qui
Prendi in considerazione utilizzando il flag NSZombieEnabled .
Saprai quindi quale oggetto deallocato stai inviando un messaggio.
Non gestisci correttamente la tua memoria - stai chiamando rilascia
/ autorelease
su alcuni oggetti più volte di quanto stai chiamando conserva
. Assicurati di seguire tutte le regole stabilite nella Gestione della memoria Guida alla programmazione per Cocoa .
0x5633b0 è solo l'indirizzo della posizione di memoria in cui è memorizzato l'oggetto. Una cosa che puoi provare a fare è aggiungere un po 'di codice al metodo init
:
- (void) init
{
if(self == (MyClass*)0x5633b0)
NSLog(@"Allocated object at address 0x5633b0"); // put a breakpoint on this line
// do rest of init...
}
Se hai altri metodi init
(ad es. initWithCoder:
, che viene chiamato per gli oggetti istanziati da un XIB), assicurati di inserire questo snippet in quei metodi come bene. Metti un punto di interruzione sulla riga NSLog
, quindi vedi quando viene colpito. Si noti che potrebbe essere colpito più volte, se un oggetto viene allocato a quell'indirizzo, deallocato e quindi un altro oggetto viene riallocato allo stesso indirizzo. L'ultimo colpo prima dell'incidente è quello che vuoi.