2009-09-29 22 views
9
(gdb) bt 
#0 0x302ac924 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___() 
#1 0x92077e3b in objc_exception_throw() 
#2 0x302d6ffb in -[NSObject doesNotRecognizeSelector:]() 
#3 0x3026e056 in ___forwarding___() 
#4 0x3024a0a2 in __forwarding_prep_0___() 
#5 0x00004ae9 in -[GameObject doesTouch:] (self=0xe893a0, _cmd=0x643ee, obj=0xe82e20) at /Users/aaa/Desktop/CPT/Game/Classes/GameObject.m:220 
#6 0x00006e05 in -[StaticGrid checkTouchNearest:] (self=0xe82f20, _cmd=0x64ec3, obj=0xe893a0) at /Users/aaa/Desktop/CPT/Game/Classes/StaticGrid.m:62 
#7 0x0000a393 in -[EAGLView touchesBegan:withEvent:] (self=0xe8dad0, _cmd=0x3199fa3c, touches=0x632c0b0, event=0xe14590) at /Users/aaa/Desktop/CPT/Game/Classes/EAGLView.m:459 
#8 0x30910f33 in -[UIWindow _sendTouchesForEvent:]() 
#9 0x308faecb in -[UIApplication sendEvent:]() 
#10 0x309013e1 in _UIApplicationHandleEvent() 
#11 0x32046375 in PurpleEventCallback() 
#12 0x30245560 in CFRunLoopRunSpecific() 
#13 0x30244628 in CFRunLoopRunInMode() 
#14 0x32044c31 in GSEventRunModal() 
#15 0x32044cf6 in GSEventRun() 
#16 0x309021ee in UIApplicationMain() 
... 

Actualmente tengo un error occuring raro que no sé la causa todavía. No estoy seguro de dónde mirar, entonces lo que quiero preguntar es ¿Qué significan las primeras cinco líneas (# 0 a # 4)? Sé que afirma que hay algunos errores, pero ¿qué son cosas como "___forwarding___"?¿Qué significa __forwarding__ en el seguimiento de pila?

Si usted tiene algún conocimiento de esto, por favor ayuda. Muchas gracias.

Respuesta

20

El reenvío se usa para uhm ... reenvío de mensajes. Cada objeto puede reenviar fácilmente los mensajes que recibe a otros objetos, consulte el excelente tutorial by Scott Stevenson. Cuando su GameObject recibe un mensaje que no comprende, intenta reenviarlo. Si no se implementó el reenvío, se llama al método doesNotRecognizeSelector y se obtiene la excepción.

Descripción detallada se puede encontrar en el Apple documentation para la clase NSObject:

Cuando un objeto se envía un mensaje para el que no tiene método correspondiente, el sistema de tiempo de ejecución da el receptor una oportunidad para delegue el mensaje a otro receptor. Delega el mensaje mediante la creación de un objeto NSInvocation que representa el mensaje y el receptor enviando un forwardInvocation : mensaje que contiene este objeto NSInvocation como argumento . El método forwardInvocation del receptor puede entonces elegir reenviar el mensaje a otro objeto. (...) la aplicación de NSObject de forwardInvocation: simplemente invoca el doesNotRecognizeSelector : método; it no reenvía ningún mensaje. Por lo tanto, si decide no aplicar forwardInvocation :, el envío de mensajes no reconocidos para objetos se lanzar excepciones.

En cuanto a su error, parece que el GameObject recibe un mensaje que no entiende. Esto puede ser un simple error tipográfico o algo más sutil como el error de administración de la memoria, tendrías que darnos más información.

+4

+1 buena respuesta. Me gustaría agregar que este es un atributo de Objective-C que es un lenguaje de programación dinámico, donde los métodos se resuelven en tiempo de ejecución, no en tiempo de compilación. Este código de escritura que llama a métodos que no existen no es un error per se, en el tiempo de ejecución su aplicación puede resolver qué hacer, muy útil para escribir proxies. – PeyloW

2

primero que quiero hacer es comprobar si tiene un GameObject -doesTouch: o + doesTouch: método. No estoy seguro de qué es _____ hacia adelante ... ¿Qué mensaje de error ves en el registro de la consola?

+0

qué no el seguimiento de la pila indica que 'doesTouch' está enviando el mensaje urecognized, en lugar de ser el mensaje no reconocido? – outis

+0

- [GameObject doesTouch:] de hecho está enviando un método no reconocido. No hay forma de saber qué es del seguimiento de la pila, pero se registrará cuando se produzca la excepción, por lo que debería estar visible en la consola de Xcode. Para obtener más información, capture la excepción o configure un punto de interrupción en objc_exception_throw (Ejecutar-> Mostrar-> Puntos de interrupción-> Doble clic para Símbolo, escriba objc_exception_throw, luego Ejecutar-> Depurar). –

Cuestiones relacionadas