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.

È stato utile?

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:

  1. In Progetto- > Modifica eseguibile attivo - > Scheda Argomenti - > Ambiente sezione variabili Ho aggiunto e impostato su YES le seguenti variabili: NSAutoreleaseFreedObjectCheckEnabled , NSZombieEnabled e NSDebugEnabled .

  2. 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:

inserisci qui la descrizione dell'immagine

2. Seleziona " Zombi " e avvia il profiler.

inserisci qui la descrizione dell'immagine

3. Fai clic sul simulatore fino a quando non raggiungi il " caso di errore deallocato "

inserisci qui la descrizione dell'immagine

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top