Wiem, jak utworzyć plik SEL
w czasie kompilacji przy użyciu, @selector(MyMethodName:)
ale chcę zrobić dynamiczne tworzenie selektora z pliku NSString
. Czy to w ogóle możliwe?
Co mogę zrobić:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
Co chcę zrobić: (pseudo kod, to oczywiście nie działa)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
Szukałem dokumentacji Apple API, ale nie znalazłem sposobu, który nie opierałby się na @selector(myTarget:)
składni czasu kompilacji .
objective-c
cocoa
dynamic
Craigb
źródło
źródło
Zgodnie z dokumentacją XCode, twój psuedocode w zasadzie robi to dobrze.
setWidthHeight = NSSelectorFromString(aBuffer);
Edycja: Bummer, zbyt wolno. : P
źródło
NSStringFromSelector(@"doWork")
konwertuje to w drugą stronę (po prostu fyi)Muszę powiedzieć, że jest to trochę bardziej skomplikowane, niż mogą sugerować odpowiedzi poprzednich respondentów ... jeśli naprawdę chcesz stworzyć selektor ... a nie tylko „zadzwoń do jednego”, który „masz w pobliżu” .. .
Musisz utworzyć wskaźnik funkcji, który będzie wywoływany przez twoją "nową" metodę. Więc dla metody takiej jak
[self theMethod:(id)methodArg];
, napiszesz ...void (^impBlock)(id,id) = ^(id _self, id methodArg) { [_self doSomethingWith:methodArg]; };
a następnie musisz wygenerować
IMP
blok dynamicznie, tym razem przechodząc, „self”SEL
, i inne argumenty ...void(*impFunct)(id, SEL, id) = (void*) imp_implementationWithBlock(impBlock);
i dodaj go do swojej klasy, wraz z dokładnym podpisem metody dla całego frajera (w tym przypadku
"v@:@"
void return, object caller, object argument)class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");
Możesz zobaczyć kilka dobrych przykładów tego rodzaju sztuczek środowiska uruchomieniowego w jednym z moich repozytoriów tutaj.
źródło
Wiem, że odpowiedź na to pytanie udzielono dawno temu, ale nadal chcę się nią podzielić. Można to zrobić
sel_registerName
również za pomocą .Przykładowy kod w pytaniu można przepisać w następujący sposób:
SEL selector = sel_registerName("doWork:"); [myobj respondsToSelector:selector];
źródło
NSSelectorFromString
wspomniane przez @ torsten-marek używasel_registerName
pod maską. appledev : "NSSelectorFromString przekazuje reprezentację znakową aSelectorName zakodowaną w UTF-8 do sel_registerName i zwraca wartość zwróconą przez tę funkcję"