Cos'è NSZombie?


Risposte:


191

È un aiuto per il debug della memoria. In particolare, quando si imposta NSZombieEnabledquindi ogni volta che un oggetto raggiunge il conteggio di conservazione 0, invece di essere deallocato, si trasforma in NSZombieun'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.


61
Fai attenzione a rimuovere questa impostazione al termine del debug perché essenzialmente perde ogni oggetto.
Justin

1
Grazie per questa semplice spiegazione. Informiamo che Cocoa Dev Link non funziona più. +1 in breve e al punto.
CRDave

95

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.


2
Questo è un consiglio incredibilmente utile.
w.donahue

4
Ho aggiornato la risposta per XCode 4 poiché rende ancora più semplice il rilevamento degli zombi negli strumenti.
Kendall Helmstetter Gelner

Non proprio, dovrebbe funzionare più o meno allo stesso modo con XCode 5 e 6.
Kendall Helmstetter Gelner

2
Posso anche confermare che con XCode 7.2
Batti il

31

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.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.