Bagaimana cara mengatur NSZombieEnabled di Xcode 4?

456

Bagaimana cara saya mengatur NSZombieEnableddan CFZombieLeveluntuk executable saya di Xcode 4?

Chetan
sumber
1
apakah Anda bertanya tentang Xcode 4?
Jehiah
8
Mengapa opsi seperti ini tidak diaktifkan secara default adalah di luar saya ...
Daniel Magnusson
26
Karena pada dasarnya mencegah pembebasan memori nyata, yang sepertinya bukan ide yang baik untuk diaktifkan secara default.
Chetan
14
@Daniel Magnusson: itu adalah hal yang paling cocok. Dengan membuat pengembangan dengan XCode tidak ramah tetapi bisa diterapkan, Anda mendapatkan pengembang yang lebih baik. Hanya bercanda.
Dan Rosenstark
3
@DanielMagnusson Saya pikir ini bukan ide yang buruk, AFAIK "Zombie" mode akan mengubah setiap objek ke objek ob jenis khusus sehingga dapat mendeteksi, ketika mendapat pesan yang dikirim. Jadi dengan mengaktifkan "mode Zombie" akan menyebabkan tidak ada objek yang akan dibatalkan alokasinya, jadi Anda harus benar-benar hanya menggunakannya saat menangani kesalahan seperti itu.
Besi

Jawaban:

753

Dalam Xcode 4.x tekan

R

(atau klik Menubar> Product> Scheme> Edit Scheme)

pilih tab "Diagnostics" dan klik "Enable Zombie Objects":

Klik "Aktifkan Objek Zombie"

Ini mengubah objek yang dilepaskan menjadi instance NSZombie yang mencetak peringatan konsol saat digunakan lagi. Ini adalah alat debugging yang meningkatkan penggunaan memori (tidak ada objek yang benar-benar dirilis) tetapi meningkatkan pelaporan kesalahan.

Kasus khas adalah ketika Anda melepaskan objek secara berlebihan dan Anda tidak tahu yang mana:

  • Dengan zombie: -[UITableView release]: message sent to deallocated instance
  • Tanpa zombie: EXC_BAD_ACCESS

Pengaturan Xcode ini diabaikan ketika Anda mengarsipkan aplikasi untuk pengiriman App Store. Anda tidak perlu menyentuh apa pun sebelum merilis aplikasi Anda.

Menekan Rsama dengan memilih Produk> Jalankan sambil terus Altmenekan tombol.
Mengklik kotak centang "Aktifkan Objek Zombie" sama dengan menambahkan secara manual "NSZombieEnabled = YA" di bagian "Variabel Lingkungan" pada tab Argumen.

Jano
sumber
27
Terima kasih - Saya bertanya-tanya di mana mereka menyembunyikan opsi ini. Sekarang saya menyadari ini adalah jendela yang sama seperti di menu 'Edit Skema'.
emp
1
Hanya untuk menambahkan ini, melakukannya di layar "Jalankan" menetapkannya untuk "Uji" juga jika kotak "Gunakan opsi tindakan Jalankan" dicentang. Jika Anda ingin melakukannya hanya untuk Uji, kotak itu perlu dicentang
Cameron
1
Harap perhatikan juga bahwa opsi ini muncul di Xcode 4.1 (kanan?)
phi
2
Dalam XCode 5 (dan versi selanjutnya dari 4 - 4.3.x pasti, mungkin lebih awal), ini adalah CMD-<( CMD-SHIFT-comma), atauProduct -> Scheme -> Edit SCheme...
Olie
1
Saya terjebak dalam masalah EXC_BAD_ACCESS yang aneh, bahkan Zombies dilewati, alangkah baiknya jika Anda dapat mengarahkan saya untuk stackoverflow.com/questions/29210057/…
Anoop Vaidya
70

Jawaban Jano adalah cara termudah untuk menemukannya .. cara lain adalah jika Anda mengklik bilah tarik turun skema -> edit skema -> tab argumen lalu tambahkan NSZombieEnabled di kolom Variabel Lingkungan dan YA di kolom nilai ...

pelajar2010
sumber
57

Saya menemukan alternatif ini lebih nyaman:

  1. Klik "Run Button Dropdown"
  2. Dari daftar pilih Profile
  3. Program "Instrumen" harus terbuka di mana Anda juga dapat memilih Zombies
  4. Sekarang Anda dapat berinteraksi dengan aplikasi Anda dan mencoba menyebabkan kesalahan
  5. Segera setelah kesalahan terjadi, Anda harus mendapatkan petunjuk tentang kapan objek Anda dirilis dan karenanya dibatalkan alokasi.

Zombie

Segera setelah zombie terdeteksi, Anda kemudian mendapatkan "Zombie Stack" yang rapi yang menunjukkan kepada Anda ketika objek tersebut dialokasikan dan di mana objek itu disimpan atau dilepaskan:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Keuntungan dibandingkan dengan menggunakan tab diagnostik Skema Xcode :

  1. Jika Anda lupa untuk menghapus centang pada opsi pada tab diagnostik tidak ada objek yang akan dilepaskan dari memori.

  2. Anda mendapatkan tumpukan yang lebih rinci yang menunjukkan kepada Anda dalam metode apa objek korup Anda dialokasikan / dirilis atau dipertahankan.

Besi
sumber
1
Opsi "Zombies" tidak ada di XCode 4 saya, mengapa?
Li Fumin
4
Pastikan Anda memilih iOS Simulator > Alldari daftar templat utama (Anda hanya dapat melakukan ini di simulator)
Besi
untuk beberapa alasan .. jika saya memilih 'zombie' itu hanya menunjukkan alokasi .. tahu mengapa?
abbood
Ini solusi terbaik. Banyak membantu saya :)
Michał Miszczyszyn
5

Dalam Xcode 4.2

  • Nama Proyek / Edit Skema / Diagnostik /
  • Aktifkan kotak centang Objek Zombie
  • Kamu sudah selesai
pratap shaik
sumber
1

Cocoa menawarkan fitur keren yang sangat meningkatkan kemampuan Anda untuk men-debug situasi seperti itu. Ini adalah variabel lingkungan yang disebut NSZombieEnabled, tonton video ini yang menjelaskan pengaturan NSZombieEnabled di objektif-C

pengguna2554822
sumber
-1

Dalam Xcode> 4.3:

Anda klik pada drop down bar skema -> edit skema -> tab argumen dan kemudian tambahkan NSZombieEnabled di kolom Variabel Lingkungan dan YA di kolom nilai.

Semoga berhasil !!!

Dipak Narigara
sumber