Ho visto suggerimenti che dicono di impostare NSZombieEnabled
su true
durante il debug. Cos'è NSZombie? È un framework? Un'ambientazione?
Ho visto suggerimenti che dicono di impostare NSZombieEnabled
su true
durante il debug. Cos'è NSZombie? È un framework? Un'ambientazione?
Risposte:
È un aiuto per il debug della memoria. In particolare, quando si imposta NSZombieEnabled
quindi ogni volta che un oggetto raggiunge il conteggio di conservazione 0, invece di essere deallocato, si trasforma in NSZombie
un'istanza. Ogni volta che uno zombi di questo tipo riceve un messaggio, registra un avviso anziché bloccarsi o comportarsi in modo imprevedibile. Pertanto, puoi eseguire il debug di problemi di rilascio eccessivo / automatico senza strumenti avanzati o ago meticoloso nelle ricerche nel pagliaio.
Il nome è un gioco abbastanza ovvio sul fatto che gli oggetti sono normalmente considerati "morti" quando raggiungono il conteggio di mantenimento 0. Con questa impostazione, continuano ad esistere in una strana emivita - né vivi, né del tutto morti. Proprio come i veri zombi, tranne per il fatto che mangiano un po 'meno cervelli.
Adam ha fatto un ottimo lavoro spiegando cosa sono gli zombi, ma usare la variabile d'ambiente non è il modo migliore per trovarli e monitorarli.
Un approccio molto migliore al rilevamento degli zombi è semplicemente usare gli strumenti: da XCode iniziare con "Esegui con strumento" e scegliere "Allocazioni".
Quindi interrompi la registrazione subito dopo l'avvio, premi il pulsante "i" sullo strumento Allocations e attiva "Enable Reference Counts" e "Enable NSZombie Detection". Ora premi di nuovo Registra nello strumento e la tua app si avvierà: se vengono inviati oggetti zombi, la registrazione dei messaggi si interromperà e verrà visualizzata una finestra di dialogo nella sequenza temporale della registrazione: puoi fare clic su di essa per trovare ogni luogo in cui si trovava un oggetto trattenuto o rilasciato.
Modifica: il consiglio precedente era per XCode 3, ecco un'aggiunta per XCode 4:
In XCode 4.2 , c'è un meccanismo ancora più semplice per utilizzare il rilevamento degli zombi: lo strumento zombi. Invece di "Esegui" per avviare l'app, usa "Profilo" e apparirà un selettore dello strumento. Seleziona "Zombie" e l'applicazione inizierà a funzionare: fai qualsiasi cosa provochi il tuo crash, apparirà una finestra di dialogo che dice "Zombie Messaged".
Da lì, fai clic sulla piccola freccia nella finestra di dialogo. Ciò porterà a un elenco di tutte le volte in cui l'oggetto zombi è stato creato, mantenuto o rilasciato. Solleva la barra laterale e puoi andare a ciascuna voce, guardando la traccia dello stack per il codice che era responsabile di ogni regolazione nel conteggio di conservazione.
Sono d'accordo con quanto ha aggiunto Kendall, è molto utile, ma ti suggerisco di fare ancora la variabile d'ambiente in modo da non dimenticare che sono abilitati. Simile al link (ora scaduto) su Cocoa Dev, lo metto in modo da non perderlo:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
Cattura molto bene la mia attenzione.
Aiuterebbe qualcuno.
Documento dettagliato sugli strumenti. https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1