【问题标题】:What does __forwarding__ in the stack trace mean?堆栈跟踪中的 __forwarding__ 是什么意思?
【发布时间】:2009-09-29 16:19:01
【问题描述】:
(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___”这样的东西是什么?

如果您对此有所了解,请提供帮助。非常感谢。

【问题讨论】:

    标签: objective-c cocoa stack-trace message-forwarding


    【解决方案1】:

    转发的东西用于嗯…转发消息。每个对象都可以轻松地将它收到的消息转发给其他一些对象,请参阅优秀的tutorial by Scott Stevenson。当您的GameObject 收到它不理解的消息时,它会尝试转发它。如果没有实现转发,则调用doesNotRecognizeSelector 方法并得到异常。

    可以在Apple documentation 中找到NSObject 类的详细说明:

    当一个对象被发送一条消息时 它没有对应的方法, 运行时系统给接收器 一个传递信息的机会 到另一个接收器。它代表 通过创建 NSInvocation 消息 表示消息的对象和 向接收者发送一个 forwardInvocation:消息包含 这个 NSInvocation 对象作为 争论。接收者的 forwardInvocation: 方法然后可以 选择将消息转发到 另一个对象。 (……) NSObject 的实现 forwardInvocation:简单地调用 不识别选择器:方法;它 不转发任何消息。因此,如果 你选择不实施 forwardInvocation:, 发送 无法识别到对象的消息将 引发异常。

    至于您的错误,GameObject 似乎收到了一些它不理解的消息。这可能是一个简单的拼写错误,也可能是内存管理错误等更微妙的问题,您必须向我们提供更多信息。

    【讨论】:

    • +1 好答案。我想补充一点,这是 Objective-C 作为动态编程语言的一个属性,其中方法是在运行时解决的,而不是在编译时解决的。这种调用不存在的方法的编写代码本身并不是错误,在运行时您的应用程序可以解决该做什么,这对于编写代理非常方便。
    【解决方案2】:

    我首先要检查的是 GameObject 是否有 -doesTouch: 或 +doesTouch: 方法。我不确定 __forwarding... 是什么。您在控制台日志中看到了什么错误消息?

    【讨论】:

    • 堆栈跟踪是否表明doesTouch 正在发送已识别的消息,而不是未识别的消息?
    • -[GameObject doesTouch:] 确实发送了一个无法识别的方法。无法从堆栈跟踪中判断它是什么,但是当抛出异常时它会被记录下来,因此它应该在 Xcode 控制台中可见。要获取更多信息,请捕获异常或在 objc_exception_throw 中设置断点(运行->显示->断点->双击符号,键入 objc_exception_throw,然后运行->调试)。
    猜你喜欢
    • 2015-05-14
    • 2011-01-06
    • 1970-01-01
    • 2011-09-13
    • 2019-06-30
    • 2011-11-09
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多