Apa itu NSZombie?

97

Saya telah melihat saran yang mengatakan untuk disetel NSZombieEnabledke truesaat debugging. Apa itu NSZombie? Apakah ini kerangka kerja? Sebuah pengaturan?

Moshe
sumber
18
NSObject mayat hidup - waspadalah!
vikingosegundo
5
Sebuah NSObject * undead.
Alex Zavatone

Jawaban:

191

Ini adalah bantuan debugging memori. Khususnya, saat Anda menyetel NSZombieEnabledlalu setiap kali sebuah objek mencapai jumlah pertahankan 0, alih-alih dialokasikan, objek itu akan berubah menjadi NSZombieinstance. Setiap kali zombie menerima pesan, itu mencatat peringatan daripada menabrak atau berperilaku dengan cara yang tidak dapat diprediksi. Dengan demikian, Anda dapat men-debug masalah pelepasan-berlebih / pelepasan otomatis yang halus tanpa alat canggih atau jarum yang teliti dalam pencarian tumpukan jerami.

Nama tersebut adalah permainan yang cukup jelas pada kenyataan bahwa benda-benda biasanya dianggap "mati" ketika mencapai hitungan 0. Dengan pengaturan ini, mereka terus ada dalam paruh yang aneh - tidak hidup, atau cukup mati. Mirip seperti zombie sungguhan, kecuali mereka makan lebih sedikit otak.

Adam Wright
sumber
61
Berhati-hatilah untuk menghapus pengaturan ini ketika Anda selesai debugging karena pada dasarnya membocorkan setiap objek.
Justin
1
Terima kasih atas penjelasan sederhana ini. Beri tahu bahwa Cocoa Dev Link tidak lagi berfungsi. 1 singkatnya dan langsung ke intinya.
CRDave
95

Adam melakukan pekerjaan yang bagus menjelaskan apa itu Zombie, tetapi menggunakan variabel lingkungan bukanlah cara terbaik untuk menemukan dan melacaknya.

Pendekatan yang jauh lebih baik untuk deteksi zombie, hanya dengan menggunakan Instrumen - dari XCode dimulai dengan "Jalankan dengan Instrumen" dan pilih "Alokasi".

Kemudian hentikan perekaman tepat setelah dimulai, tekan tombol "i" pada instrumen Alokasi, dan aktifkan "aktifkan jumlah referensi" dan "Aktifkan Deteksi NSZombie". Sekarang tekan Rekam lagi di instrumen, dan aplikasi Anda akan mulai - jika ada objek zombie yang dikirim, rekaman pesan akan berhenti, dan kotak dialog akan muncul di garis waktu perekaman - Anda dapat mengekliknya untuk menemukan setiap tempat objek berada. dipertahankan atau dilepaskan.

Sunting: Saran sebelumnya untuk XCode 3, berikut adalah tambahan untuk XCode 4:

Di XCode 4.2 , ada mekanisme yang lebih mudah untuk menggunakan deteksi Zombie - Instrumen Zombie. Alih-alih "Jalankan" untuk memulai aplikasi, gunakan "Profil" dan pemilih instrumen akan muncul. Pilih "Zombie", dan aplikasi akan mulai berjalan - lakukan apa pun yang menyebabkan crash Anda, sebuah dialog akan muncul yang bertuliskan "Zombie Messaged".

Dari sana, klik panah kecil di kotak dialog. Itu akan membawa ke daftar waktu kapan objek zombie dibuat, dipertahankan, atau dirilis. Tarik bilah samping dan Anda dapat pergi ke setiap entri, melihat jejak tumpukan untuk kode yang bertanggung jawab untuk setiap penyesuaian dalam jumlah penahanan.

Kendall Helmstetter Gelner
sumber
2
Ini adalah nasihat yang sangat berguna.
w. Donahue
4
Saya memperbarui jawaban untuk XCode 4 karena semakin mempermudah pendeteksian Zombie di Instrumen.
Kendall Helmstetter Gelner
Tidak juga, seharusnya bekerja hampir sama dengan XCode 5 dan 6.
Kendall Helmstetter Gelner
2
Saya juga dapat mengonfirmasi itu dengan XCode 7.2
Kalahkan
31

Saya setuju dengan apa yang ditambahkan Kendall, ini sangat berguna, tetapi saya akan menyarankan tetap melakukan variabel lingkungan sehingga Anda tidak lupa bahwa mereka diaktifkan. Mirip dengan tautan (sekarang kedaluwarsa) di Cocoa Dev, saya meletakkan ini jadi saya tidak melewatkannya:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

Ini menarik perhatian saya dengan sangat baik.

Matthew Frederick
sumber