program precio licencia developer desarrollo desarrollador cuenta certificacion apple iphone objective-c xcode debugging ios

iphone - precio - itunes connect



Depurador de Xcode: ver el valor de la variable (7)

Mi código en UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

¿Cómo puedo ver los valores de delegate.myData o indexPath.row en el Depurador? delegate.myData debe ser una matriz e indexPath.row an int . Solo puedo ver las direcciones de memoria de los objetos delegate e indexPath pero, ¿dónde están myData y row ?


Esto se pone un poco complicado. Estos objetos son clases o estructuras personalizadas, y mirar dentro de ellos no es tan fácil en Xcode como en otros entornos de desarrollo.

Si yo fuera tú, NSLogaría los valores que deseas ver, con alguna descripción.

es decir:

NSLog(@"Description of object & time: %i", indexPath.row);


Estoy de acuerdo con otros carteles en que Xcode como entorno en desarrollo debería incluir una manera fácil de depurar variables. Bueno, buenas noticias, ¡HAY uno!

Después de buscar y no encontrar una respuesta / tutorial simple sobre cómo depurar variables en Xcode, fui a explorar con Xcode y encontré este descubrimiento (al menos para mí) muy útil.

Cómo depurar fácilmente sus variables en Xcode 4.6.3

En la pantalla principal de Xcode, asegúrese de ver el Área de depuración inferior haciendo clic en el botón de la esquina superior derecha que se muestra en la captura de pantalla.

Ahora configure un Punto de interrupción - la línea en su código donde desea que su programa se detenga, haciendo clic en el borde de su Área de código.

Ahora en el Área de depuración busca estos botones y haz clic en el que está en el medio. Notarás que tu área ahora está dividida en dos.

Ahora ejecuta tu aplicación.

Cuando se alcanza el primer Punto de Inflexión durante la ejecución de su programa, verá en el lado izquierdo todas las variables disponibles en ese punto de interrupción.

Puede expandir las flechas de la izquierda en la variable para un mayor detalle. E incluso use el campo de búsqueda para aislar esa variable que desee y ver cómo cambia en tiempo real a medida que "entra" en el alcance del punto de interrupción.

En el lado derecho de su área de depuración, puede enviar para imprimir las variables que desee utilizando el botón derecho del mouse sobre la variable deseada.

Como puede ver, ese menú contextual está lleno de opciones de depuración muy interesantes. Tal como Watch que ya ha sido sugerido con comandos escritos o incluso Edit Value ... ¡ que cambia el valor de tiempo de ejecución de su variable!

Ok, espero que esto te haya ayudado. Por favor, ¡Vota!


Prueba Ejecutar-> Mostrar-> Expresiones

Ingrese el nombre de la matriz o lo que sea que esté buscando.


Puede imprimir valores en la ventana de la consola en tiempo de ejecución. A continuación se muestran los pasos:

  1. Coloque un punto de quiebre para el que desea obtener valores
  2. Ahora realice la depuración paso a paso.
  3. Coloque un cursor en variable / delegate cuyo valor se va a verificar en tiempo de ejecución.
  4. Ahora esto mostrará la descripción de la variable / delegado
  5. Al hacer clic en "i" se mostrará una descripción detallada
  6. Esto también imprimirá detalles en la ventana de la consola.

Su confusión proviene del hecho de que las propiedades declaradas no son (necesariamente nombradas igual a) variables (instancia).

La expresion

indexPath.row

es equivalente a

[indexPath row]

y la tarea

delegate.myData = [myData objectAtIndex:indexPath.row];

es equivalente a

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

asumiendo el nombre estándar para las propiedades sintetizadas.

Además, el delegate probablemente esté declarado como de tipo id<SomeProtocol> , es decir, el compilador no ha podido proporcionar información de tipo real para el delegate en ese punto, y el depurador se basa en la información proporcionada en tiempo de compilación. Como id es un tipo genérico, no hay información en tiempo de compilación sobre las variables de instancia en delegate .

Esas son las razones por las que no ve myData o row como variables.

Si desea inspeccionar el resultado de enviar -row o -myData , puede usar los comandos p o po :

p (NSInteger)[indexPath row] po [delegate myData]

o use la ventana de expresiones (por ejemplo, si sabe que su delegate es del tipo real MyClass * , puede agregar un (MyClass *)delegate expresión (MyClass *)delegate o delegate botón derecho, elegir View Value as… y escribir el tipo real de delegate (por ejemplo, MyClass * ).

Dicho esto, acepto que el depurador podría ser más útil:

  • Podría haber una opción para decirle a la ventana del depurador que use información de tipo de tiempo de ejecución en lugar de información en tiempo de compilación. Redirigiría el depurador, se concede, pero proporcionaría información útil;

  • Las propiedades declaradas se pueden mostrar en un grupo llamado propiedades y permitir la inspección (opcional) directamente en la ventana del depurador. Esto también ralentizaría el depurador debido a la necesidad de enviar un mensaje / ejecutar un método para obtener información, pero también proporcionaría información útil.


Tambien tu puedes:

  1. Establezca un punto de interrupción para pausar la ejecución.
  2. El objeto debe estar dentro del alcance de ejecución
  3. Mueva el puntero del mouse sobre el objeto o la variable
  4. Aparecerá una información sobre herramientas amarilla
  5. Mueva el mouse sobre la información sobre herramientas
  6. Haga clic sobre las dos pequeñas flechas que apuntan hacia arriba y hacia abajo
  7. Aparecerá un menú contextual
  8. Seleccione "Imprimir descripción", ejecutará una [descripción del objeto]
  9. La descripción aparecerá en la salida de la consola

En mi humilde opinión un poco escondido y engorroso ...