2009-09-29 102 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() 
... 

目前我有一個罕見的發生錯誤,我不知道原因呢。我不知道在哪裏看,所以我想問的是前五行(#0到#4)是什麼意思?我知道它聲稱存在一些錯誤,但是像「___forwarding___」這些東西是什麼?堆棧跟蹤中的__forwarding__是什麼意思?

如果您對此有所瞭解,請幫助。非常感謝你。

回答

20

該轉發內容用於uhm ...轉發消息。每個對象都可以輕鬆地將收到的消息轉發給其他對象,請參閱優秀的tutorial by Scott Stevenson。當您的GameObject收到一條不理解的消息時,它會嘗試轉發它。如果沒有執行轉發,則調用doesNotRecognizeSelector方法,您會得到異常。

詳細描述可以在Apple documentation中找到用於NSObject類:

當對象被髮送的消息爲 它不具有相應的方法, 運行時系統使接收機 機會將消息 委託給另一個接收者。它代表了 消息通過創建表示消息和 發送接收機中的 forwardInvocation一個NSInvocation的 對象:含有 此NSInvocation的對象作爲 參數消息。接收方的 forwardInvocation:方法可以然後 選擇轉發消息到 另一個對象。 (...) NSObject的實現 forwardInvocation:只需調用 doesNotRecognizeSelector:方法;它 不轉發任何消息。因此,如果 您選擇不執行 forwardInvocation:,發送 無法識別的消息對象將 引發異常。

至於你的錯誤,似乎GameObject得到一些它不明白的消息。這可能是一個簡單的輸入錯誤或者像內存管理錯誤那樣更微妙的東西,你必須給我們更多的信息。

+4

+1好答案。我想補充一點,這是Objective-C的一個屬性,它是一種動態編程語言,其中的方法在運行時解決,而不是在編譯時解決。這種調用不存在的方法的編寫代碼在運行時不是錯誤,您的應用程序可以解決該做什麼,這對於編寫代理非常方便。 – PeyloW 2009-09-30 08:40:47

2

我會檢查的第一件事是GameObject是否有一個-doesTouch:或+ doesTouch:方法。我不確定__forwarding ...是什麼。你在控制檯日誌中看到什麼錯誤消息?

+0

堆棧跟蹤是否表明'doesTouch'發送的是被識別的消息,而不是無法識別的消息? – outis 2009-09-30 05:18:45

+0

- [GameObject doesTouch:]確實發送了一個無法識別的方法。沒有辦法從堆棧跟蹤中知道它是什麼,但是在引發異常時會記錄它,所以它應該在Xcode控制檯中可見。要獲取更多信息,請捕獲異常或在objc_exception_throw(Run-> Show-> Breakpoints-> Double-Click for Symbol,輸入objc_exception_throw,然後運行 ​​- >調試)中設置斷點。 – 2009-09-30 06:54:39

相關問題