objective c - ¿Por qué LLDB no puede imprimir view.bounds?
lldb inspect variables (8)
A partir de Xcode 6.3, tenemos una mejor solución. En resumen, debe importar UIKit para LLDB para conocer estos tipos: expr @import UIKit
. Echa un vistazo a este artículo para aprender algunos trucos para hacer tu vida aún más fácil.
Cosas como esta me vuelven loco cuando se depura:
(lldb) p self.bounds
error: unsupported expression with unknown type
error: unsupported expression with unknown type
error: 2 errors parsing expression
(lldb) p (CGRect)self.bounds
error: unsupported expression with unknown type
error: unsupported expression with unknown type
error: C-style cast from ''<unknown type>'' to ''CGRect'' is not allowed
error: 3 errors parsing expression
(lldb) p [self bounds]
error: ''bounds'' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (CGRect)[self bounds]
(CGRect) $1 = origin=(x=0, y=0) size=(width=320, height=238)
(lldb) You suck!
error: ''You'' is not a valid command.
(lldb) …
¿Por qué fallaron los primeros 3 intentos? ¿Hay alguna manera más simple de imprimir self.bounds
? Gracias.
Con Xcode 6.3, podemos importar UIKit y luego imprimir el marco o límite de la vista
expr @import UIKit
p self.view.bounds
LLDB no admite la notación de puntos para el envío de mensajes cuando se usa p
y es por eso que
p self.bounds
no funciona, pero
p [self bounds]
hace.
(En realidad, lo admite para objetos cuando usas po
, sin embargo)
Además, LLDB no tiene información de tipo de objetos no disponibles en el tiempo de ejecución, por lo que debe proporcionar un tipo explícitamente al convertir el valor de retorno.
No sé cuál era el contexto cuando ejecutas esto. Pero parece que lldb no puede encontrar el tipo de self
.
Para que lldb evalúe self.bounds
, necesita saber que el tipo de self
es que algunos Class tienen bounds
propiedad. No puede suponer que self
es del tipo ObjC porque puede llamarlo en ese contexto:
void test()
{
struct
{
int bounds;
} self;
}
así que obtienes el error de error: unsupported expression with unknown type
Sin embargo, si lo llamas usando [self bounds]
, lldb sabe que ese tipo es mucho más del tipo ObjC porque la sintaxis []
solo se aplica al tipo ObjC. Pero dado que el tipo de self
no está claro, todavía no puede evaluar el resultado de [self bounds]
CGRect
[self bounds]
por lo que debe CGRect
a CGRect
Probé la respuesta de @an0 expr @import UIKit
, pero no funcionó.
Luego agregué un archivo pch y agregué estas líneas de código en el archivo:
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif
#endif /* PrefixHeader_pch */
A continuación, vincule el archivo pch a mi proyecto:
Ejecuta la aplicación nuevamente, luego puedo usar la notación de puntos en la consola lldb:
(lldb) po self.view.bounds
Para saber cómo agregar un archivo pch, consulte la respuesta aquí Archivo PCH en Xcode 6
Prueba con la siguiente expresión
p self.view.bounds.size.width
o usar,
po self.view
p - Imprimir solo se usa para imprimir valores normales / simples mientras que po - Print Object funciona igual que NSLog para imprimir el valor de un objeto
Puedes acceder a ella por
p (CGRect)[view bounds]
o
p view.layer.bounds
view.bounds
es en realidad view.layer.bounds
Parece que el tipo de información de [UIView bounds]
no está disponible para lldb
Te encantará Xcode 6.3+
TLDR
(lldb) e @import UIKit
(lldb) po self.view.bounds
El analizador de expresiones Objective-C de LLDB ahora puede importar módulos. Cualquier expresión posterior puede basarse en prototipos de función y método definidos en el módulo:
(lldb) p @import Foundation
(lldb) p NSPointFromString(@"{10.0, 20.0}");
(NSPoint) $1 = (x = 10, y = 20)
Antes de Xcode 6.3, los métodos y funciones sin información de depuración requerían typecasts explícitos para especificar su tipo de devolución. La importación de módulos permite que un desarrollador evite el proceso más laborioso de determinar y especificar esta información manualmente:
(lldb) p NSPointFromString(@"{10.0, 20.0}");
error: ''NSPointFromString'' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (NSPoint)NSPointFromString(@"{10.0, 20.0}”);
(NSPoint) $0 = (x = 10, y = 20)
Otras ventajas de importar módulos incluyen mejores mensajes de error, acceso a funciones variadas cuando se ejecuta en dispositivos de 64 bits y eliminación de tipos de argumentos inferidos potencialmente incorrectos.
PD : si también confundes p vs po
p == print == expression -- == e --
po == expression -O -- == e -O --
--
es el separador entre command+flag
vs inputs
-O
indicador es para invocar el método de description
objeto