2011-05-30 10 views
8

Desde dentro de Xcode, el BGF dicta la siguiente:Como inspeccionar 'super' al depurar objc en GDB

> po self 
<SomeClassName: 0x6672e50> 

Hasta aquí todo bien ... Pero:

> po super 
No symbol "super" in current context. 

En aras de claridad, lo que realmente quiero hacer es enviar un mensaje al super durante la depuración. Por ejemplo, quiero hacer algo como esto:

> po [super doSomething] 

Pero, ¿cómo referencia que super desde el entorno de GDB? ¡Gracias!

Respuesta

4

Oye, estábamos just talking about this! La palabra super no tiene ningún efecto excepto como el receptor de un mensaje, es decir, [super doSomething]. Es solo una nota para el compilador que debería buscar la implementación de un método en la superclase en lugar del objeto de la clase actual.

Si desea el objeto de superclase real de un objeto, utilice el del protocolo superclass method: [self superclass].


No sé cómo hacer exactamente lo que quiere. ¿Qué tal un anzuelo de depurador? Poner esto en su clase:

- (void) callSupersDoSomething { 
    [super doSomething]; 
} 

y luego se le puede llamar [self callSupersDoSomething] desde el depurador.

+1

¿no devolvería un objeto Class en lugar de una referencia a super? Entonces en mi ejemplo anterior, en gdb: 'po [self superclass]' devuelve: 'SomeClassName', en lugar de lo requerido:' ' – Jim

+1

@Jim: No existe tal cosa como" una referencia a super ". Hay una referencia al objeto actual en 'self', y puede obtener una referencia a la superclase con' [self superclass] ', pero no hay nada real en su programa llamado" super ". Es una palabra clave que hace que el mensaje se envíe a "self" pero omite los métodos de la clase actual al resolver el mensaje. – Chuck

+0

El comentario de Chuck es mucho más claro que el mío, pero @Jim, ¿qué estás buscando al llegar a la superclase? –

4

Algo a tener en cuenta aquí, es que super == self. Es el mismo puntero a objeto, pero la palabra clave super le dice al código de envío del mensaje que comience a buscar una implementación de un nivel en la jerarquía de clases.

+0

Genial, lo que intento averiguar es cómo hacer lo mismo en gdb. Es decir, envíe un mensaje a sí mismo pero utilice la implementación de un nivel en la jerarquía de clases. En el código es tan simple como '[super doSomething]', pero si escribo eso en gdb obtengo 'Sin símbolo" super "en el contexto actual. Estoy tratando de averiguar el equivalente de gdb. – Jim

+0

¿Qué estás tratando de lograr exactamente? Podría pasar por el problema de ejecutar objc_msgSendSuper() en el depurador, pero nunca tuve ocasión de hacerlo en todos los años que he estado escribiendo código Obj-C. – NSResponder

+0

Simplemente no enviaré un mensaje a Super mientras estoy depurando, tengo algunas buenas razones, demasiado tiempo de un caso de uso para explicarlo aquí. Gracias. – Jim

Cuestiones relacionadas