Próbuję nauczyć się pisać wtyczki za pomocą SIMBL. Mam wtyczkę do załadowania aplikacji docelowej, a także znam metodę, którą chcę nadpisać. Jednak nie jestem w stanie poprawnie używać class_getInstanceMethod na podstawie fragmentów w Internecie. Czy zmieniło się coś w OSX 10.6 i/lub ObjC2?Jak dynamicznie zastąpić implementację metody w ObjC2?
Poniższy kod z culater.net daje „dereferencji wskaźnik do niepełnej typu” na drugim ostatnim stwierdzeniem:
BOOL DTRenameSelector(Class _class, SEL _oldSelector, SEL _newSelector)
{
Method method = nil;
// First, look for the methods
method = class_getInstanceMethod(_class, _oldSelector);
if (method == nil)
return NO;
method->method_name = _newSelector;
return YES;
}
istnieje kompletny przykład jak przesłonić metodę z wykorzystaniem SIMBL wtyczek? Dzięki!
To działało. Dzięki! – Abhi
Peter - Czy można również wykonać "funkcję swizzling", tj. Zastępując implementację funkcji, która nie jest metodą klasy? – Abhi
Nie. Metoda swizzowania działa, ponieważ implementacja selektora jest dynamicznie sprawdzana w momencie wysłania komunikatu - tj. W czasie wykonywania. Istnieje nazwa, która jest selektorem, i wartość, która jest implementacją, a swizzling zamienia jedną wartość na inną, podobnie jak zmieniające się wartości w słowniku. Funkcje nie są wyszukiwane dynamicznie; adres zostanie przywiązany, gdy plik wykonywalny zostanie załadowany i pozostanie na nim ustalony, a połączenie przychodzi bezpośrednio pod ten adres, więc nie ma nic do zmiany. –