Hola, soy Miguel y para hoy les traigo este artículo.
Índice
No es solo para imprimir objetos
En iOS, po
se utiliza normalmente en lldb
(Depurador de bajo nivel) para imprimir un objeto. Recientemente, sin embargo, un amigo me mostró que po
puede hacer mucho más que eso (descargo de responsabilidad, soy un desarrollador de Android, ¡aprender esto me está volviendo la cabeza!).
Échale un vistazo.
Difuminar dinámicamente la aplicación en segundo plano
Tengo una aplicación simple a continuación que no es más que una simple etiqueta. Usando po
, puedo activarlo para que se desvanezca.
Para hacerlo, al iniciar la aplicación, haga clic en Ctrl + Cmd + Y para ingresar a un modo de pausa donde lldb
se muestra el terminal.
En la terminal, solo necesitamos agregar el siguiente código (Objective-C).
(lldb) po [UIView animateWithDuration:3 animations:^void (void) { [[[[[[UIApplication sharedApplication] delegate] window] subviews] firstObject] setAlpha:(double)0]; }]
El código establece un tiempo de animación de tres segundos y establece el alfa de toda la vista en cero, haciéndola transparente.
`po`
no es solo para imprimir objetos. ¡Está literalmente ejecutando código en ejecución!
Si desea que se revierta, asegúrese de que hayan pasado tres segundos y ejecute el mismo código, excepto que esta vez configure el alfa en uno.
Cambio de texto en una etiqueta sin código cuando se está ejecutando una aplicación
Imagínese tener un proyecto casi vacío, excepto por una etiqueta con el texto Label
. Mientras se ejecuta la aplicación, queremos cambiar el texto de la etiqueta de Label
a Gold
(según el diagrama a continuación).
¿Cómo nos referimos al objeto, ya que no hay nombre para la etiqueta?
Para hacer eso, capturemos la dirección del objeto de etiqueta.
Empiece por ejecutar la aplicación.
Luego, capture la dirección de la etiqueta usando el Visor de jerarquía de vista:
- Haga clic en Ver visor de jerarquía como se muestra en el diagrama a continuación
- Haga clic con el botón derecho en la etiqueta y luego seleccione Imprimir descripción de UILabel .
En la terminal de depuración, debería tener algo similar a lo siguiente:
Printing description of $35: <UILabel: 0x7f8c7b002b30; frame = (148 418; 119 61); text = ‘Label’; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x600001361540>>
Observe el código resaltado en negrita. El UILabel
es la dirección de memoria donde se encuentra la etiqueta. Podemos ver que su contenido es text = 'Label'
. Ahora tienes la dirección de memoria del objeto.
Convertir la etiqueta del objeto a texto diferente
En el lldb
, escriba po [0x7f8c7b002b30 setText:@”Gold”]
(lldb) po [0x7f8c7b002b30 setText:@”Gold”] 0x000000010212c990
`correos`
nos permite acceder a la dirección de memoria de un objeto y ejecutar la operación deseada en él
Algún consejo deberíamos lanzarlo a
id
o al puntero de tipo (es decirUILabel *
) o la superclase (por ejemploUIView *
)p. ej. o o
po [(id)0x7f8c7b002b30 setText:@”Gold”]
po [(UILabel *)0x7f8c7b002b30 setText:@”Gold”]
po [(UIView *)0x7f8c7b002b30 setText:@”Gold”]
Notas adicionales
Lo anterior se hizo usando código Objective-C. Si prefiere escribir en otro idioma, tiene varias opciones.
El enfoque de sintaxis similar a C (en el objetivo C)
En lugar del enfoque Objective-C, puede usar la sintaxis de estilo C. En el lldb
tipo:
(lldb) po ((UILabel *)0x7f8c7b002b30).text=@”Gold” Gold
A continuación, escriba c
en el lldb
para continuar el programa.
Revisa tu dispositivo. Si la etiqueta no ha cambiado, haga clic en la interfaz.
Tenga en cuenta que esta vez, deberá convertirlo explícitamente en el tipo para establecer el text
, ya que solo está disponible para UILabel
clase.
El enfoque Swift
Si está ejecutando un entorno Swift, también podría considerar usar el lenguaje Swift. En el lldb
tipo:
(lldb) po unsafeBitCast(0x7fd09b008140, to: UILabel.self).text=“Gold”
Escribir c
en el lldb
para continuar con el programa y luego verifique su dispositivo para ver si la etiqueta ha cambiado. Si no es así, haga clic en la interfaz.
Tenga en cuenta que también se necesita un casting explícito.
Fallo por enviar el tipo incorrecto
Si pones un número en lugar de una cadena cuando usas los estilos Objective-C o C, se bloqueará la aplicación cuando continúes. Pero no para Swift, ya que producirá un error de sintaxis:
// Objective C (crash the app as no casting int to String) po [0x7f8c7b002b30 setText:@(123)] // C style approach (crash the app as no casting of int to String) po ((UILabel *)0x7f8c7b002b30).text=@(123) // Swift (produce syntax error, and won't crash the app) po unsafeBitCast(0x7fd09b008140, to: UILabel.self).text=123
Si la aplicación falla (es decir, en la sintaxis Objective C o C), para continuar, debe salir de la aplicación (p. Ej., Escriba q
) e inícielo de nuevo.
Así que asegúrese de recordar convertirlo primero en el estilo de cadena que se muestra a continuación:
// Objective C po [0x7f8c7b002b30 setText:[@(123) stringValue]] // There's no way to cast it in C style, so use Objective C approach po ((UILabel *)0x7f8c7b002b30).text=[@(123) stringValue] // Swift po unsafeBitCast(0x7f8c7b002b30, to: UILabel.self).text=String(123)
¿Estamos en Objective-C o Swift land?
Cuando estamos en lldb
, no podemos simplemente escribir Objective-C o Swift como queramos. Necesitamos comprobar en qué entorno estamos y luego escribir en ese idioma.
Utilice el siguiente comando para verificar el entorno actual:
// Test if it is in Objective C, this will not error out. (lldb) po [UIApplication sharedApplication]// Test if it is in Swift, this will not error out. (lldb) po UIApplication.shared
¡Ayuda!
En caso de que esté perdido y no sepa qué comandos están disponibles, Cmd + Shift + Cero acudirá a su rescate. Según el objeto de memoria, puede comenzar a buscar sobre él para encontrar la propiedad relevante para realizar cambios.
En resumen, recuerde que:
`po`
no es solo para Print Object. ¡Está literalmente ejecutando código en ejecución!`po`
nos permite acceder a la dirección de memoria de un objeto y ejecutar la operación deseada en él.
Ahora tiene una poderosa herramienta dinámica para ejecutar en su aplicación en ejecución.
Feliz exploración.
Añadir comentario