, 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
- resolveInstanceMethod:/resolveClassMethod: yöntemini uygulamak için bir şans olur
- forwardingTargetForSelector: Bir temsilci iletmek için bir şans olur
- 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ı?
İ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. –
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 ... –
FWIW, objc_msgForward(), hedef platform/mimariye göre montajda uygulanmaktadır: http://opensource.apple.com/source/objc4/objc4-437.1/runtime/ Messengers.subproj/ –