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

Hiện tại tôi gặp lỗi hiếm khi xảy ra mà tôi chưa biết nguyên nhân. Tôi không chắc chắn nơi để xem xét, vì vậy những gì tôi muốn hỏi là những gì làm năm dòng đầu tiên (# 0 đến # 4) có nghĩa là gì? Tôi biết rằng nó tuyên bố rằng có một số lỗi, nhưng những thứ như "___forwarding___" là gì?__forwarding__ trong dấu vết ngăn xếp nghĩa là gì?

Nếu bạn có một số kiến ​​thức về điều này, vui lòng trợ giúp. Cảm ơn nhiều.

Trả lời

20

Công cụ chuyển tiếp được sử dụng cho các thông báo chuyển tiếp uhm… chuyển tiếp. Mỗi đối tượng có thể dễ dàng chuyển tiếp các tin nhắn nhận được tới một số đối tượng khác, xem số tutorial by Scott Stevenson xuất sắc. Khi GameObject của bạn nhận được một tin nhắn mà nó không hiểu, nó sẽ chuyển tiếp nó. Nếu không có chuyển tiếp nào được triển khai, phương thức doesNotRecognizeSelector được gọi và bạn sẽ nhận được ngoại lệ.

Mô tả chi tiết có thể được tìm thấy trong Apple documentation cho lớp NSObject:

Khi một đối tượng được gửi một thông điệp cho mà nó không có phương pháp tương ứng, hệ thống runtime cho người nhận một cơ hội để ủy quyền tin nhắn cho người nhận khác. Nó ủy quyền thông báo bằng cách tạo một đối tượng NSInvocation đại diện cho thông báo và gửi cho người nhận một forwardInvocation: thông báo có chứa đối tượng NSInvocation này làm đối số . Phương thức forwardInvocation của người nhận: sau đó có thể chọn chuyển tiếp thư đến một đối tượng khác. (…) Việc triển khai NSObject của forwardInvocation: chỉ cần gọi phương thức doesNotRecognizeSelector:; nó không chuyển tiếp bất kỳ thư nào. Do đó, nếu bạn chọn không triển khai forwardInvocation :, gửi thông báo không được nhận dạng tới các đối tượng sẽ tăng ngoại lệ.

Vì lỗi của bạn, có vẻ như số GameObject được gửi một số thư mà nó không hiểu. Đây có thể là lỗi đánh máy đơn giản hoặc một thứ gì đó tinh tế hơn như lỗi quản lý bộ nhớ, bạn phải cung cấp thêm thông tin cho chúng tôi.

+4

+1 câu trả lời hay. Tôi muốn thêm rằng đây là một thuộc tính của Objective-C là một ngôn ngữ lập trình động, trong đó các phương thức được giải quyết tại thời gian chạy, không phải lúc biên dịch. Mã viết này gọi các phương thức không tồn tại không phải là lỗi trên mỗi lần, trong thời gian chạy, ứng dụng của bạn có thể giải quyết việc cần làm, rất tiện dụng để viết proxy. – PeyloW

2

Điều đầu tiên tôi sẽ kiểm tra là liệu GameObject có phương thức -doesTouch: hoặc + doesTouch: hay không. Tôi không chắc chắn những gì __forwarding ... là. Bạn thấy thông báo lỗi nào trong nhật ký bảng điều khiển?

+0

Không theo dõi ngăn xếp cho biết 'doesTouch' đang gửi thư được nhận dạng không, thay vì là thư không được nhận dạng? – outis

+0

- [GameObject doesTouch:] thực sự đang gửi một phương thức không được công nhận. Không có cách nào để nói nó là gì từ stack trace, nhưng nó sẽ được ghi lại khi ngoại lệ được ném, vì vậy nó sẽ được hiển thị trong bảng điều khiển Xcode. Để biết thêm thông tin, hãy nắm bắt ngoại lệ hoặc thiết lập một điểm ngắt trong objc_exception_throw (Run-> Show-> Breakpoints-> Double-Click cho Symbol, gõ objc_exception_throw, sau đó Run-> Debug). –

Các vấn đề liên quan