¿Cómo configuro NSZombieEnabled en Xcode 4?

456

¿Cómo configuro NSZombieEnabledy CFZombieLevelpara mi ejecutable en Xcode 4?

Chetan
fuente
1
estás preguntando sobre Xcode 4?
Jehiah
8
¿Por qué opciones de este tipo no está activado por defecto es más allá ...
Daniel Magnusson
26
Porque básicamente evita cualquier liberación real de memoria, lo que no parece una buena idea habilitar de forma predeterminada.
Chetan
14
@Daniel Magnusson: es una cosa de supervivencia del más apto. Al hacer que el desarrollo con XCode sea hostil pero viable, obtienes mejores desarrolladores. Es una broma.
Dan Rosenstark
3
@DanielMagnusson Creo que no es una mala idea, AFAIK, el modo "Zombi" cambiará cada objeto a un objeto ob de tipo especial para que pueda detectar, cuando recibe mensajes enviados. Por lo tanto, tener habilitado el "Modo zombi" hará que ningún objeto sea desasignado, por lo que realmente solo debería usarlo para abordar tales errores.
Besi

Respuestas:

753

En Xcode 4.x presione

R

(o clic Menubar> Product> Scheme> Edit Scheme)

seleccione la pestaña "Diagnóstico" y haga clic en "Habilitar objetos zombis":

Haz clic en "Habilitar objetos zombis"

Esto convierte los objetos liberados en instancias de NSZombie que imprimen advertencias de la consola cuando se usan nuevamente. Esta es una ayuda de depuración que aumenta el uso de memoria (no se libera realmente ningún objeto) pero mejora la notificación de errores.

Un caso típico es cuando liberas un objeto en exceso y no sabes cuál:

  • Con zombies: -[UITableView release]: message sent to deallocated instance
  • Sin zombies: EXC_BAD_ACCESS

Esta configuración de Xcode se ignora cuando archiva la aplicación para enviarla a la App Store. No necesita tocar nada antes de lanzar su aplicación.

Presionar Res lo mismo que seleccionar Producto> Ejecutar mientras se mantiene Altpresionada la tecla.
Hacer clic en la casilla de verificación "Habilitar objetos zombis" es lo mismo que agregar manualmente "NSZombieEnabled = YES" en la sección "Variables de entorno" de la pestaña Argumentos.

Jano
fuente
27
Gracias. Me preguntaba dónde ocultaban estas opciones. Ahora me doy cuenta de que esta es la misma ventana que en el menú 'Editar esquema'.
emp
1
Solo para agregar a esto, hacerlo en la pantalla "Ejecutar" también lo configura para "Probar" si la casilla "Usar las opciones de la acción Ejecutar" está marcada. Si quieres hacerlo solo para Test, esa casilla debe estar desmarcada
Cameron
1
Tenga en cuenta también que esta opción aparece en Xcode 4.1 (¿verdad?)
phi
2
En XCode 5 (y versiones posteriores de 4 - 4.3.x seguro, tal vez antes), esto es CMD-<( CMD-SHIFT-comma), oProduct -> Scheme -> Edit SCheme...
Olie
1
Estoy atrapado en un extraño problema de EXC_BAD_ACCESS, incluso los Zombies se omiten, sería bueno si me pudieras dirigir a este stackoverflow.com/questions/29210057/…
Anoop Vaidya
70

La respuesta de Jano es la forma más fácil de encontrarlo ... otra forma sería hacer clic en la barra desplegable del esquema -> editar esquema -> pestaña de argumentos y luego agregar NSZombieEnabled en la columna Variables de entorno y SÍ en la columna de valor ...

alumno2010
fuente
57

Encuentro esta alternativa más conveniente:

  1. Haga clic en el "Menú desplegable del botón Ejecutar"
  2. De la lista elige Profile
  3. El programa "Instrumentos" debería abrirse donde también puede elegir Zombies
  4. Ahora puede interactuar con su aplicación e intentar causar el error
  5. Tan pronto como ocurra el error, debe tener una idea de cuándo se lanzó su objeto y, por lo tanto, se desasignó.

Zombis

Tan pronto como se detecta un zombie, obtienes una "Pila de zombis" ordenada que te muestra cuándo se asignó el objeto en cuestión y dónde se retuvo o se liberó:

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]

Ventajas en comparación con el uso de la pestaña de diagnóstico de los esquemas de Xcode :

  1. Si olvida desmarcar la opción en la pestaña de diagnóstico, no se liberarán objetos de la memoria.

  2. Obtiene una pila más detallada que le muestra en qué métodos se asignó / liberó o retuvo su objeto corrupto.

Besi
fuente
1
Falta la opción "Zombies" en mi XCode 4, ¿por qué?
Li Fumin
44
Asegúrese de elegir iOS Simulator > Allde la lista de plantillas principales (solo puede hacer esto en el simulador)
Besi
por alguna razón ... si selecciono 'zombies' solo muestra asignaciones ... ¿alguna idea de por qué?
Abbood
Esta es la mejor solución. Me ayudó mucho :)
Michał Miszczyszyn
5

En Xcode 4.2

  • Nombre del proyecto / Editar esquema / Diagnóstico /
  • Casilla de verificación Habilitar objetos zombis
  • Ya terminaste
pratap shaik
fuente
1

Cocoa ofrece una característica genial que mejora enormemente sus capacidades para depurar tales situaciones. Es una variable de entorno que se llama NSZombieEnabled, vea este video que explica cómo configurar NSZombieEnabled en el objetivo-C

usuario2554822
fuente
-1

En Xcode> 4.3:

Hace clic en la barra desplegable del esquema -> editar esquema -> pestaña argumentos y luego agrega NSZombieEnabled en la columna Variables de entorno y SÍ en la columna de valor.

Buena suerte !!!

Dipak Narigara
fuente