Theo tôi được biết, một phương pháp chưa thực hiện được giải quyết theo cách sau:Điều gì quyết định quá trình mà các phương pháp chưa thực hiện được giải quyết?
- resolveInstanceMethod:/resolveClassMethod: được một cơ hội để thực hiện phương pháp này
- forwardingTargetForSelector: nhận được một cơ hội để chuyển tiếp đến một đại biểu
- forwardInvocation: là cơ hội để xử lý phương thức khi nó thấy phù hợp.
Quy trình ba bước này được xác định ở đâu? Tôi muốn tự mình xử lý vì NSInvocation có thể quá nặng đối với nhu cầu của tôi. Tôi đã có một poke xung quanh nguồn thời gian chạy và không thể thực sự nhìn thấy bất cứ điều gì.
Dường như thời gian chạy cũ sẽ chuyển tiếp: args: trên máy thu, để thực hiện việc này nhưng dường như đã chuyển sang chế độ mới. Tôi đoán rằng quá trình phải được xác định bởi khung chứ không phải là thời gian chạy, vì nó sẽ là lạ nếu thời gian chạy phụ thuộc vào Cocoa đến mức yêu cầu NSInvocation để xử lý tin nhắn. Nó có lẽ là một phương pháp không có giấy tờ được gọi trên NSObject/NSProxy?
Edit:
Dường như thời gian chạy tuyên bố, nhưng không bao giờ định nghĩa, một hàm C được gọi là khi objc_msgSend không thể tìm thấy một thực hiện:
id objc_msgForward(id object,SEL message,...);
I don' t làm việc cho Apple, vì vậy tôi không biết làm thế nào Foundation thực hiện điều này, nhưng ít nhất là trong trường hợp của Cocotron, họ sử dụng:
id objc_msgForward(id object,SEL message,...)
{
Class class=object->isa;
struct objc_method *method;
void *arguments=&object;
if((method=class_getInstanceMethod(class,@selector(forwardSelector:arguments:)))!=NULL)
return method->method_imp(object,@selector(forwardSelector:arguments:),message,arguments);
else
{
OBJCRaiseException("OBJCDoesNotRecognizeSelector","%c[%s %s(%d)]", class_isMetaClass(class) ? '+' : '-', class->name,sel_getName(message),message);
return nil;
}
}
thêm phương thức forwardSelector:arguments:
dường như không hoạt động, vì vậy tôi đoán điều này cụ thể đối với Cocotron. Bất cứ ai biết những gì objc_msgForward
nào trong Foundation?
Nhu cầu của bạn là gì và tại sao bạn nghĩ 'NSInvocation' quá nặng đối với họ? Tôi khuyên bạn không nên phát minh lại bánh xe trừ khi bạn đã dứt khoát phát hiện ra rằng 'NSInvocation' đang làm chậm bạn xuống. –
Tôi đang viết một cái gì đó giống như một ngôn ngữ kịch bản sử dụng chuyển tiếp tin nhắn để giao tiếp với mục tiêu-c. Bây giờ, tôi đang sử dụng NSInvocation, nhưng nó có thể kết thúc làm điều này hàng ngàn lần mỗi giây, vì vậy chi phí sẽ đáng chú ý. Nhưng tôi đoán tôi cũng chỉ tò mò ... –
FWIW, objc_msgForward() được thực hiện trong hội đồng theo nền tảng/kiến trúc mục tiêu: http://opensource.apple.com/source/objc4/objc4-437.1/runtime/ Messengers.subproj/ –