#objective-c #function #pointers
#objective-c #функция #указатели
Вопрос:
Мне нужно сделать что-то вроде этого:
id myFunction = aMethodDeclaredInMyClass;
[self myFunction]
любая помощь приветствуется!
Комментарии:
1. Смотрите селекторы в Objective-C. Первые результаты в Google дают вам все, что вам нужно.
Ответ №1:
Если вы заранее знаете метод:
[self performSelector:@selector(myMethod) withObject:nil];
Если вы заранее не знаете название метода:
SEL selector = NSSelectorFromString(someSelectorStringYoureGiven);
[self performSelector:selector withObject:nil];
В обоих этих примерах предполагается, что ваша функция не принимает аргументов и не требует выполнения в другом потоке, а также не требует отложенного выполнения. Существует множество вариантов для всех комбинаций этих условий (и NSInvocation для еще более сложных случаев). Найдите performSelector
в документации xcode, чтобы увидеть все варианты.
Комментарии:
1. отлично:
SEL myAction = nil; .. some stuff .. myAction = @selector(actionWalk); .. some stuff .. [self performSelector:myAction];
спасибо @Jarret Hardie
Ответ №2:
Я предполагаю, что вы хотите;
[self performSelector:@selector(aMethodDeclaredInMyClass)]
Прочитайте документы по динамической отправке;
Ответ №3:
Также смотрите objc_msgSend()
. Вы бы настроили SEL
переменную селектора.
Комментарии:
1. Вы почти никогда не захотите возиться с
objc_msgSend
напрямую. Это все равно что прихлопывать мух палашом. Бывают случаи, когда вы хотите его использовать, но они очень особенные.2. Не
objc_msgSend()
ли это более или менее то же самое, что-performSelector:withObject:
, но с меньшими накладными расходами? (Искренне любопытно.)3. @Алекс Рейнольдс: В определенной степени. Дело в том, что
objc_msgSend
он более гибкий, и им легче злоупотреблять, не осознавая этого, поэтому использовать его напрямую — это своего рода плохая привычка. Возможно, моя формулировка была немного резкой, но я не хочу видеть, как невинные пользователи Google без необходимости стреляют себе в ногу.4. Есть ли у вас примеры того, как это может быть использовано не по назначению? Теперь мне действительно любопытно. Я понятия не имел, что это считается некорректным.
5. @Алекс Рейнольдс: Как насчет случаев, в которых
objc_msgSend_stret
было бы более уместно? Если вы начнете рассматривать эти угловые случаи, вы, возможно, изначально не выполнили цель использования Obj-C. 🙂