Jak rozumiem, metoda wdrożone zostanie rozwiązany w następujący sposób:Co decyduje o procesie, w którym rozwiązano niezaimplementowane metody?
- resolveInstanceMethod:/resolveClassMethod: dostaje szansę na wdrożenie metody
- forwardingTargetForSelector: dostaje szansę doczekać delegata
- forwardInvocation: otrzymuje szansę na obsłużenie metody zgodnie z oczekiwaniami.
Gdzie jest zdefiniowany ten trzyetapowy proces? Sam sobie z tym poradzę, ponieważ NSInvocation może być zbyt ciężki dla moich potrzeb. Miałem poke wokół źródła runtime i naprawdę nie widzę nic.
Wygląda na to, że stare środowisko uruchomieniowe będzie wywoływać dalej: args: na odbiorniku, aby to zrobić, ale wydaje się, że odszedł od nowego. Zgaduję, że proces musi zostać zdefiniowany przez framework, a nie środowisko wykonawcze, ponieważ byłoby dziwne, gdyby środowisko wykonawcze zależało od Cocoa w zakresie wymagającym NSInvocation do obsługi wiadomości. Czy jest to być może nieudokumentowana metoda, która jest wywoływana w NSObject/NSProxy?
Edit:
Wygląda na to, że środowisko wykonawcze deklaruje, ale nie określa, funkcję C, która jest wywoływana gdy objc_msgSend nie może znaleźć realizacji:
id objc_msgForward(id object,SEL message,...);
I don” t pracują dla Apple, więc nie wiem, jak Fundacja to implementuje, ale przynajmniej w przypadku Cocotron używają:
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;
}
}
Dodanie metody forwardSelector:arguments:
wydaje się nie działać, więc domyślam się, że jest to specyficzne dla Cocotron. Czy ktoś wie, co robi objc_msgForward
w Fundacji?
Jakie są Twoje potrzeby i dlaczego "NSInvocation" jest dla nich zbyt ciężki? Radziłbym nie wymyślać koła, chyba że definitywnie odkryłeś, że 'NSInvocation' spowalnia Cię. –
Piszę coś trochę jak język skryptowy, który używa przekazywania wiadomości do interfejsu z celem-c. Na razie używam NSInvocation, ale może to się skończyć tysiące razy na sekundę, więc narzut byłby zauważalny. Ale myślę, że jestem po prostu ciekawy ... –
FWIW, objc_msgForward() jest zaimplementowany w złożeniu zgodnie z docelową platformą/architekturą: http://opensource.apple.com/source/objc4/objc4-437.1/runtime/ Messengers.subproj/ –