2010-07-17 7 views
10

Recientemente comencé a usar variables de instancia sintetizadas en mis proyectos de iPhone. El problema es que no puedo ver los ivars sintetizados en el depurador. ¿Hay alguna manera de ver las propiedades de un objeto en el depurador cuando no está utilizando las variables de instancia explícitamente declaradas?Ver el valor de una propiedad sintetizada en el depurador de Xcode cuando no hay una variable de respaldo


Tengo que aclarar la segunda pregunta. No estoy preguntando cómo acceder a las propiedades, o lo que hacen; Sé todas esas cosas. Tenía la impresión de que no podía acceder directamente a las variables de instancia al usar ivars sintetizados basados ​​en this post. Claramente pude hacer lo que antes pensaba que no era posible. Me pregunto qué está pasando.

Estoy usando Xcode 3.2.4/iPhone Simulator/LLVM Compiler 1.5.

Respuesta

9

Editado para añadir respuesta a la segunda parte:

Esto funciona en Xcode 3.1, así que no veo por qué no funcionará en versiones posteriores

Lo que podría hacer es enviar mensajes directamente al objeto desde la consola mientras se depura.

Presumiblemente, se ha detenido en un punto de interrupción y está mirando las variables en la vista de depuración. para objetos, estos te muestran los indicadores. Puede que no vea el iVar, pero tiene el puntero al objeto y puede enviarle mensajes. por ejemplo:

  • Has dejado en algún punto de interrupción dentro del objeto
  • La vista variable muestra la dirección del puntero de self ser (por ejemplo) 0x1031380.
  • En la consola escriba po [0x1031380 title] (tenga en cuenta que no hay punto y coma) e ingrese
  • Debería ver lo que desea en la consola.

Cuando se declara una propiedad con (retain) y, posteriormente, sintetizar la propiedad, que está creando los emisores que retienen el objeto/valor pasado a ellos. por lo que en el caso anterior se debe reescribir el método:

- (void)viewDidLoad { 
    self.title = @"woah"; 
} 

Y la cadena se mantendrá como parte de la incubadora. Además, prefiero usar (copy) para clústeres de clase que tienen pares mutables/inmutables (NSString, NSSet, NSArray, etc.). De esta forma, la propiedad no se puede cambiar externamente.

+2

En realidad, no es tanto un caso de preferencia como * debería * usar propiedades de copia para NSString, etc. a menos que tenga una muy buena razón para no hacerlo. – JeremyP

+0

Me deshice del código falso, ya que parecía estar causando confusión, y aclaré la segunda parte de mi pregunta. – kubi

+2

'po [0x1031380 title]' ¡Esa es la respuesta, gracias! Tener que usar comandos de texto para ver iVars + sin protección para acceder directamente a iVars significa que probablemente no continuaré usando iVars sintetizados. Es un dolor y no parece que realmente me consiga nada útil. – kubi

5

No tiene que utilizar el puntero/dirección de la variable. En su lugar se puede utilizar el nombre de la variable así:

po [myVar title] 

Xcode le ayudará a escribir el nombre de la variable (miVar arriba) si la variable está en el alcance.

0

Si no desea escribir manualmente po [blahblah], puede hacer lo que xnav sugirió here, donde puede declarar explícitamente las variables de instancia en el encabezado, o "en el área variable de depuración, haga clic derecho en 'self' y seleccione "Agregar expresión", luego ingrese, por ejemplo ' _wordLength 'y el ivar se mostrarán "

Cuestiones relacionadas