2011-01-29 13 views
6

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?

  1. resolveInstanceMethod:/resolveClassMethod: dostaje szansę na wdrożenie metody
  2. forwardingTargetForSelector: dostaje szansę doczekać delegata
  3. 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?

+0

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

+0

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

+1

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

Odpowiedz

6

Piszę coś trochę jak język skryptowy, który używa wiadomość przekierowanie do współpracy z Objective-C. Na razie używam wywołania NSInvocation, ale może to skończyć się robiąc to tysiące razy na sekundę, więc obciążenie może być zauważalne. Ale myślę, że jestem też ciekaw tylko ...

Jeśli chodzi o przesyłanie komunikatu jest zaniepokojony, zachowanie jest [często subtelnie] różny w różnych platform i wersji środowiska wykonawczego.

W żadnym wypadku nie wymyślaj ponownie koła. Obecnie dostępne są dwa mosty językowe, które są bardzo zbliżone do mostowania pełnej wierności, z którego można się nauczyć. Oba mają liberalne licencje, które pozwalają na takie ponowne wykorzystanie.

Konkretnie, projekt MacRuby oferuje implementację Ruby, która znajduje się na szczycie CoreFoundation i Garbage Collector firmy Objective-C. Jest to most "najbardziej natywny", dostępny (a nie strasznie przenośny - nie jest celem projektu).

Most PyObjC to najlepszy przykład mostu o wysokiej wierności między środowiskiem wykonawczym Objective-C i innym dynamicznym językiem uruchomieniowym języka OO; Pyton.Jest nieco bardziej przenośny, chociaż bity inne niż Mac OS X prawdopodobnie zgniły nieco.

(byłbym niedbały w nie wspomnieć F-Script;? Nowy język zbudowany na Objective-C, dla których, moim zdaniem, źródłem jest/był dostępny)

Wszystkie mosty czynienia zarówno z metody przekazywanie, tworzenie podklas i pośredniczenie między runtime, z których wszystkie brzmią, jakby pasowały do ​​twoich szczególnych potrzeb.

+0

Źródła F-Script znajdują się w tym samym pliku .zip, który zawiera dystrybucję binarną na http://www.fscript.org. – millenomi

+0

Kod źródłowy F-Script jest również dostępny na GitHub: https://github.com/pmougin/F-Script – 0xced

+0

Dobre połączenie. Nie pomyślałem o tym. –

Powiązane problemy