Ho passato un po 'di tempo a eseguire il debug di un problema strano con ARC e le funzioni dealloc personalizzate.Problema di debugging Xcode e ARC (skipping dealloc)
- sto sottoclassi
NSOperation
classe - ho impostato blocco completamento di questa operazione
- L'operazione fa riferimento un forte proprietà di molto oggetto piatto (nessun metodo, ivars automatici, due proprietà forti) chiamiamo questo oggetto
DataRequest
- seguendo tutte le linee guida il blocco di completamento usa solo riferimenti deboli agli oggetti locali (inclusa l'operazione stessa)
- né compilatore né analizzatore ge nerate eventuali problemi
DataRequest
detiene il solo riferimento all'operazione che viene generata e viene distrutta nel blocco di completamento dell'operazione. È SEMPRE distrutto (il suodealloc
viene sempre eseguito)- L'operazione ha una personalizzazione
dealloc
. Ho solo una singola chiamata NSLog in esso.
... e la questione è:
Se corro questo sotto nel debugger, il punto di interruzione nella dealloc non è mai colpito, non compare mai il messaggio di log. Principalmente pensavo che l'operazione perdesse.
Se eseguo questo strumento, tutto va bene, la console di sistema stampa il messaggio e lo strumento di allocazione segnala l'operazione che viene liberata dall'istantanea di stack corretta incluso il dealloc personalizzato. Nessuna perdita rilevata.
Sono sicuro al 100% che utilizzo le stesse impostazioni del compilatore per il debug e la profilazione.
La cosa più confusa alla fine: se creo una versione personalizzata di [DataRequest dealloc]
e inserisco self.operation = nil;
su di esso, tutto funziona correttamente anche dal debugger.
Qualcuno ha qualche suggerimento sulle opzioni del linker del compilatore per cercare di vedere qualche differenza? può essere un bug negli strumenti Apple (tutti noi eravamo nella posizione che incolpavano un grosso pesce per i nostri errori, giusto?)
... e sì, ho provato con GDB e LLDB. Il risultato è stato lo stesso - quello che potrebbe indicare qualcosa.
Ho cercato di creare un campione minimalista ma semplicemente lavorato (anzi);)
Grazie
Ho fatto un'osservazione molto semplice ... se eseguo l'app sul simulatore da XCode (GDB o LLDB) i miei messaggi di log in 'dealloc' non vengono stampati. Se esco dal debugger e avvio l'app direttamente dal simulatore, Console.app mostra tutti i messaggi. No compilare nessun collegamento in mezzo. Strano. – simpleone
... e un risultato ancora più semplice ... Se eseguo l'app da XCode in una sessione di debug, dealloc non viene chiamato (log non stampato) se eseguo l'app manualmente nel simulatore e quindi allego il debugger. tutto è come previsto – simpleone