Я знаю, как создать SEL
во время компиляции, используя, @selector(MyMethodName:)
но я хочу создать селектор динамически из файла NSString
. Это вообще возможно?
Что я могу сделать:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
Что я хочу сделать: (псевдокод, это явно не работает)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
Я искал документы Apple API, но не нашел способа, который бы не полагался на @selector(myTarget:)
синтаксис времени компиляции .
objective-c
cocoa
dynamic
Craigb
источник
источник
Согласно документации XCode, ваш псевдокод в основном понимает это правильно.
setWidthHeight = NSSelectorFromString(aBuffer);
Изменить: облом, слишком медленно. :П
источник
NSStringFromSelector(@"doWork")
преобразует это в другую сторону (просто fyi)Я должен сказать, что это немного сложнее, чем можно было бы предположить из ответов предыдущих респондентов ... если вы действительно действительно хотите создать селектор ... а не просто "вызвать тот", который у вас "валяется" .. .
Вам нужно создать указатель на функцию, который будет вызываться вашим "новым" методом ... так что для такого метода
[self theMethod:(id)methodArg];
вы должны написать ...void (^impBlock)(id,id) = ^(id _self, id methodArg) { [_self doSomethingWith:methodArg]; };
а затем вам нужно сгенерировать
IMP
блок динамически, на этот раз передавая "self"SEL
, и любые аргументы ...void(*impFunct)(id, SEL, id) = (void*) imp_implementationWithBlock(impBlock);
и добавьте его в свой класс вместе с точной сигнатурой метода для всего присоски (в данном случае
"v@:@"
void return, вызывающий объект, аргумент объекта)class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");
Вы можете увидеть несколько хороших примеров такого рода махинаций во время выполнения в одном из моих репозиториев здесь.
источник
Я знаю, что на это давным-давно ответили, но все же хочу поделиться. Это можно сделать и с помощью
sel_registerName
.Пример кода в вопросе можно переписать следующим образом:
SEL selector = sel_registerName("doWork:"); [myobj respondsToSelector:selector];
источник
NSSelectorFromString
упомянутое @ torsten-marek используетsel_registerName
под капотом. appledev : «NSSelectorFromString передает закодированное в UTF-8 символьное представление aSelectorName в sel_registerName и возвращает значение, возвращаемое этой функцией»