2011-01-29 39 views
6

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?

  1. resolveInstanceMethod:/resolveClassMethod: được một cơ hội để thực hiện phương pháp này
  2. forwardingTargetForSelector: nhận được một cơ hội để chuyển tiếp đến một đại biểu
  3. 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?

+0

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. –

+0

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ò ... –

+1

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/ –

Trả lời

6

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 nhắn chuyển tiếp để giao tiếp với Objective-C. Hiện tại, tôi đang sử dụng NSInvocation, nhưng nó có thể kết thúc làm điều này hàng nghìn lần trên mỗi giây, vì vậy chi phí sẽ là đáng chú ý. Nhưng tôi đoán tôi cũng chỉ cần tò mò ...

Theo như chuyển tiếp tin nhắn có liên quan, hành vi [thường phụ thuộc] trên các nền tảng và thời gian chạy khác nhau.

Trong mọi trường hợp, không tái phát minh ra bánh xe. Có hai cầu nối ngôn ngữ có sẵn ngày hôm nay mà làm khá gần với cầu nối toàn cầu trung thực mà từ đó bạn có thể học một tấn. Cả hai đều có giấy phép tự do đặc biệt để cho phép tái sử dụng.

Cụ thể, dự án MacRuby cung cấp triển khai Ruby nằm trên đỉnh của CoreFoundation và Objective-C Garbage Collector. Đó là cây cầu "có nguồn gốc" nhất có sẵn (và không phải là kết quả di động khủng khiếp - không phải là mục tiêu của dự án).

Cầu PyObjC là ví dụ tốt nhất có sẵn của cầu nối độ trung thực cao giữa thời gian chạy Objective-C và thời gian chạy của ngôn ngữ OO động khác; Python.Đó là một chút di động hơn, mặc dù các bit không phải Mac OS X có khả năng bị hỏng một chút.

(Tôi sẽ là người bất cẩn trong không nhắc đến F-Script;? Một ngôn ngữ mới được xây dựng trên Objective-C mà, tôi tin rằng, nguồn là/đã có sẵn)

Tất cả các cầu đối phó với cả hai phương pháp chuyển tiếp, phân lớp và proxy chéo trong thời gian chạy, tất cả đều giống như chúng được áp dụng cho các nhu cầu cụ thể của bạn.

+0

Các nguồn cho F-Script nằm trong cùng một tệp .zip chứa phân phối nhị phân tại http://www.fscript.org. – millenomi

+0

Mã nguồn F-Script cũng có sẵn trên GitHub: https://github.com/pmougin/F-Script – 0xced

+0

Cuộc gọi tốt. Tôi đã không nghĩ về điều đó. –

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