Что означает __forwarding__ в трассировке стека?

(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 ()
...

В настоящее время у меня есть редкая ошибка, которую я пока не знаю, причину. Я не уверен, где посмотреть, поэтому я хочу спросить, что означают первые пять строк (от #0 до #4)? Я знаю, что это утверждает, что есть некоторые ошибки, но каковы эти вещи, как___forwarding___"?

Если у вас есть знания в этом, пожалуйста, помогите. Большое спасибо.

2 ответа

Решение

Переадресация используется для передачи сообщений. Каждый объект может легко пересылать полученные сообщения некоторым другим объектам, см. Превосходное руководство Скотта Стивенсона. Когда ваш GameObject получает сообщение, которое он не понимает, он пытается переслать его. Если переадресация не реализована, doesNotRecognizeSelector Метод вызывается, и вы получаете исключение.

Подробное описание можно найти в документации Apple для NSObject учебный класс:

Когда объекту отправляется сообщение, для которого у него нет соответствующего метода, система времени выполнения дает получателю возможность делегировать сообщение другому получателю. Он делегирует сообщение, создав объект NSInvocation, представляющий сообщение, и отправит получателю сообщение forwardInvocation:, содержащее этот объект NSInvocation в качестве аргумента. Затем метод forwardInvocation: получателя может переслать сообщение другому объекту. (…) Реализация forwardInvocation в NSObject: просто вызывает метод hasNotRecognizeSelector:; он не пересылает никаких сообщений. Таким образом, если вы решите не реализовывать forwardInvocation:, отправка нераспознанных сообщений объектам вызовет исключения.

Что касается вашей ошибки, кажется, что GameObject получает сообщение, которое он не понимает. Это может быть простая опечатка или что-то более тонкое, например, ошибка управления памятью, вам нужно дать нам больше информации.

Прежде всего я хотел бы проверить, есть ли у GameObject метод -doesTouch: или +doesTouch:. Я не уверен, что __направление... Какое сообщение об ошибке вы видите в журнале консоли?

Другие вопросы по тегам