Ho visto suggerimenti per impostare NSZombieEnabled
su true
durante il debug. Cos'è NSZombie? È un quadro? Un'impostazione?Che cos'è NSZombie?
risposta
È un ausilio di debug della memoria. Nello specifico, quando si imposta NSZombieEnabled
, ogni volta che un oggetto raggiunge il conteggio 0, anziché essere deallocato, si trasforma in un'istanza NSZombie
. Ogni volta che uno zombi riceve un messaggio, registra un avvertimento piuttosto che schiantarsi o comportarsi in modo imprevedibile. In questo modo, è possibile eseguire il debug di problemi di over-release/autorelease senza strumenti avanzati o faticose aghi nelle ricerche sul pagliaio.
Il nome è un gioco abbastanza ovvio sul fatto che gli oggetti sono normalmente considerati "morti" quando raggiungono il conteggio 0. Con questa impostazione, continuano ad esistere in una strana semi-vita - né vivente, né del tutto morta . Molto simile ai veri zombi, tranne che mangiano un minor numero di cervelli.
Adam ha fatto un ottimo lavoro spiegando cosa sono gli zombi, ma l'utilizzo della variabile di ambiente non è il modo migliore per trovarli e rintracciarli.
Un approccio molto migliore per il rilevamento di zombi, è solo per utilizzare strumenti - da XCode iniziare con "Esegui con strumento" e scegliere "Allocazioni".
Quindi interrompere la registrazione subito dopo l'avvio, premere il pulsante "i" sullo strumento di allocazione e attivare "abilita conteggi di riferimento" e "Abilita rilevamento NSZombie". Ora premi di nuovo Registra nello strumento e la tua app si avvierà - se vengono inviati oggetti zombi, la registrazione si interromperà e una finestra di dialogo comparirà nella timeline della registrazione - puoi fare clic su di essa per trovare ogni posizione in cui è stato inserito un oggetto mantenuto o rilasciato.
Edit: consiglio precedente era per XCode 3, ecco un'aggiunta per XCode 4:
in Xcode 4.2, c'è un meccanismo ancora più facile fare uso di rilevamento Zombie - lo strumento Zombie. Invece di "Esegui" per avviare l'app, usa "Profilo" e verrà visualizzato un selettore dello strumento. Seleziona "Zombie" e l'app inizierà a funzionare: fai qualunque cosa causi il crash, una finestra pop-up apparirà dicendo "Zombie Messaged".
Da lì, fare clic sulla piccola freccia nella finestra di dialogo. Ciò richiederà un elenco di tutte le volte in cui l'oggetto zombi è stato creato, conservato o rilasciato. Sollevare la barra laterale e si può andare a ciascuna voce, guardando la traccia dello stack per il codice che era responsabile di ogni regolazione nel conteggio dei ritiri.
Questo è un consiglio incredibilmente utile. –
Ho aggiornato la risposta per XCode 4 poiché rende ancora più semplice eseguire il rilevamento degli zombi in Strumenti. –
Vorrei poter passare più volte questo! – benekastah
Sono d'accordo con quello che ha aggiunto Kendall, è molto utile, ma suggerirò ancora di fare la variabile d'ambiente in modo da non dimenticare che sono abilitati. Simile al link (ora scaduta) Cocoa Dev, ho messo questo in modo non mi manca:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
Esso cattura la mia attenzione molto bene.
Anche i client possono ottenere messaggi di errore spettrali! :-) –
upvote per 'AAAAARRRRRRGH !!! CERVELLI !!! '. mi ha fatto ridere – passsy
Aiutare qualcuno.
Documento dettagliato sugli strumenti. https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1
Un non morto NSObject - attenzione! – vikingosegundo
Un NSObject * non morto. –