2011-01-29 15 views
6

, bir gerçeklenmemiş yöntem şu şekilde çözüme kavuşturulacağını:Kullanılmayan yöntemlerin çözümlenmesini belirleyen süreç nedir? Anladığım kadarıyla

  1. resolveInstanceMethod:/resolveClassMethod: yöntemini uygulamak için bir şans olur
  2. forwardingTargetForSelector: Bir temsilci iletmek için bir şans olur
  3. forwardInvocation: yöntemi uygun gördüğü şekilde ele alma şansı yakalar.

Bu üç aşamalı işlem nerede tanımlanır? NSInvocation'ın ihtiyaçlarım için çok ağır olabileceğinden kendim halletmek istiyorum. Çalışma zamanı kaynağı etrafında bir şaka yaptım ve gerçekten hiçbir şey göremiyorum.

Eski çalışma zamanının ileriye doğru çağrı yapacağı anlaşılıyor: args: alıcıda, bunu yapmak için ama yeni olandan gelmiş gibi görünüyor. Sürecin, çalışma zamanı yerine çerçeve tarafından tanımlanması gerektiğini tahmin ediyorum çünkü çalışma zamanı, iletileri işlemek için NSInvocation gerektirdiği ölçüde Kakao'ya bağlıysa garip olurdu. NSObject/NSProxy üzerinde çağrılan belgesiz bir yöntem olabilir mi?

Düzenleme:

Bu çalışma zamanı bildirir gibi görünüyor, ama, objc_msgSend bir uygulama bulamadığında çağrılan bir C işlevi tanımlar asla:

id objc_msgForward(id object,SEL message,...);

I don' t Apple için çalışıyorum, bu yüzden bunu nasıl uygulayacağımı bilmiyorum, fakat en azından Cocotron durumunda, şu değerleri kullanıyorlar:

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; 
    } 
} 

bir forwardSelector:arguments: yöntem ekleyerek işe yaramıyor, bu yüzden bu Cocotron özgü olduğunu tahmin ediyorum. Foundation'da objc_msgForward ne yapar bilen var mı?

+0

İhtiyaçlarınız nedir? Neden NSInvocation'un onlar için çok ağır olduğunu düşünüyorsunuz? NSInvocation’un sizi yavaşlattığını kesin olarak anlamadıkça, tekerleği yeniden icat etmemenizi tavsiye ederim. –

+0

Nesne-c ile arabirim kurmak için mesaj iletmeyi kullanan bir komut dosyası diline benzer bir şey yazıyorum. Şimdilik, NSInvocation'ı kullanıyorum, ancak bu saniyede binlerce kez sonuçlanabilirdi, bu yüzden yükü farkedebilecekti. Ama sanırım sadece merak ediyorum ... –

+1

FWIW, objc_msgForward(), hedef platform/mimariye göre montajda uygulanmaktadır: http://opensource.apple.com/source/objc4/objc4-437.1/runtime/ Messengers.subproj/ –

cevap

6

Ben amaç-c ile arayüz için mesaj yönlendirme kullanan bir komut dosyası dili gibi biraz şey yazıyorum. Şimdilik, NSInvocation kullanıyorum, ancak saniyede saniyede binlerce kez yapabildiğim için, bu yük üstte fark edilebilir olacaktır. Ama

Bildiğim kadarıyla mesajı iletme söz konusu olduğunda, davranış [ustaca sık] farklı platformlarda ve çalışma zamanı sürümleri arasında farklı ... Ben de sadece merak ediyorum sanırım.

Her durumda, tekerleği yeniden icat etmeyin. Bugün, bir tonu öğrenebileceğiniz tam sadakat köprülerine oldukça yakın olan iki dil köprüsü vardır. Her ikisinin de, bu tür yeniden kullanım için özel olarak izin veren liberal lisansları bulunmaktadır.

Özellikle, MacRuby projesi CoreFoundation ve Objective-C Çöp Toplayıcısı'nın üstüne oturan bir Ruby uygulaması sunar. Mevcut olan "en doğal" köprüdür (ve sonuç olarak projenin amacı değil).

PyObjC köprüsü, Objective-C çalışma zamanı ve başka bir dinamik OO dili çalışma zamanı arasında yüksek bir güvenilir köprünün mevcut en iyi örneğidir; Python.Mac OS X bitleri biraz çürümüş olsa da, biraz daha taşınabilir.

(? I F-Script söz de dikkatsiz olurdu; için Objective-C, inanıyorum, kaynak/üzerine inşa yeni bir dil kullanılabilir)

Bütün köprülerde hem yöntemle başa Yönlendirme, alt sınıflama ve çapraz çalışma zamanı proxy'si, bunların hepsi belirli ihtiyaçlarınız için geçerli gibi görünür.

+0

F-Script kaynakları, http://www.fscript.org adresindeki ikili dağıtım içeren aynı .zip dosyasındadır. – millenomi

+0

F-Script kaynak kodu GitHub'da da kullanılabilir: https://github.com/pmougin/F-Script – 0xced

+0

İyi çağrı. Bunu düşünmemiştim. –