Ho avuto un incidente exc_bad_access piuttosto interessante oggi. Dopo un sacco di scavo, ho trovato le seguenti informazioni (in esecuzione in simulatore):In che modo NSLogs può causare l'arresto anomalo del codice?
Se ho appena eseguito il codice, l'app si arresterebbe in modo casuale a un punto casuale durante il caricamento dei dati nel mio oggetto gestito. Da quello che ho potuto vedere, si è verificato un arresto anomalo quando ho caricato i dati nell'oggetto gestito, non nelle sezioni che sono state convertite da JSON per dati sull'oggetto effettivamente utilizzato (da stringhe e NSNull a ints/float e nils)
I crash casuali sono, ovviamente, malvagi, quindi ho provato a passare attraverso il processo nel debugger, ma ciò non è risultato pratico - stavo elaborando un sacco di oggetti, quindi li ho passati uno dopo l'altro semplicemente non ha funzionato Così ho deciso di aggiungere alcuni NSLogs per tracciare il processo e cercare di individuare un pattern in questo modo.
Immediatamente risolto l'incidente.
Solo un NSLog, in qualsiasi punto del processo, ha impedito l'arresto.
Alla fine ho rintracciato la traccia dello stack e ho trovato il problema: stavo accedendo all'oggetto gestito in un ambiente con thread, ma NON dall'interno del metodo performBlockAndWait: MOC associato. A quel punto, l'incidente è stato incredibilmente ovvio per me - sono scioccato di non avere più problemi prima. Sono disposto a scommettere che tra avere un piccolo insieme di dati di test di 2-3 oggetti e avere il codice di debug lì con NSlog, l'errore è stato mascherato in modo abbastanza efficace in precedenza ... ma la domanda rimane:
Perché un NSLog impedisce l'arresto anomalo dell'app? Come diavolo potrebbe un pezzo di codice senza effetti collaterali modificare l'esecuzione del resto dell'app? Questo non ha senso!
usi ovunque performSelector: metodo e selettore che non restituisce il tipo id come parametro per esso? Alcune volte NSLog può prevenire errori che si sono verificati con questi errori.In tal caso è necessario utilizzare NSInvocation – BergP