Chcę zbudować mały system wtyczek dla obiektów w obiekty-c.Objective-C dodaje funkcjonalność do każdej metody obiektu
Teraz utknąłem w punkcie, w którym chcę dynamicznie (w czasie wykonywania) dodać linię kodu do każdej funkcji dostępnej w obiekcie.
Grałem z biblioteką uruchomieniową, ale nie znalazłem rozwiązania.
Co próbowałem tak daleko jest taka:
id (^impyBlock)(id, id, ...) = ^(id self_, id arguments, ...)
{
// My custom code for every function here
id (*func)(__strong id,SEL,...) = (id (*)(__strong id, SEL, ...))imp;
return func(obj, s, arguments);
};
id (*impyFunct)(id, SEL,...) = imp_implementationWithBlock(impyBlock);
method_setImplementation(mList[i], impyFunct);
Mój problem jest, gdy istnieje więcej niż jeden argument nie mam szansy przekazać je do „func()”. AFAIK nie jest to możliwe w C.
Innym rozwiązaniem, o którym myślałem jest robienie magii za pomocą metody swizzling.
W krokach:
- Tworzenie „Method swizzle”, który po prostu wywołuje mój kod niestandardowy i wywołuje oryginalną metodę potem (za pomocą schematu nazewnictwa)
- zmienić IMP każdej funkcji z jednego w „Metoda swizzle”
- Utwórz nową metodę ze „starej” wdrożenie i zmiany nazwy na schemacie jak „___name”
w tym roztworze siedzę w punkcie 3. nie mam mana ged dynamicznie stworzyć kompletną nową metodę.
Czy ktoś może mi pomóc z moimi problemami powyżej lub ma inne rozwiązanie dla funkcji "catch all method".
Najlepiej byłoby coś takiego jak Invocation, która również przechwytuje już zdefiniowane funkcje.
Dzięki za pomoc!
To dość intensywna czarna magia. Czy na pewno musisz to zrobić? Uwielbiam błąkać się z takimi rzeczami samemu i wspierać je, ale może istnieć lepszy sposób na osiągnięcie swojego "pomyślnego celu". –
Czy masz jakieś inne pomysły na system wtyczek, w których mogę "hakować" w każdej funkcji obiektu. (Część zahaczająca działa całkiem nieźle, ale kluczem do problemu jest wywołanie oryginalnej implementacji). – regexp
Po wykonaniu czegoś podobnego, może uda mi się zaoszczędzić trochę czasu: W końcu trafisz na ceglaną ścianę, gdy dojdziesz do metod variadycznych (tj. Metod jak 'stringWithFormat:'). Jeśli to dla ciebie złamanie umowy, radzę się teraz poddać. – ipmcc