Указатель на функцию Objective-c

#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:

Ответ №3:

Также смотрите objc_msgSend() . Вы бы настроили SEL переменную селектора.

Комментарии:

1. Вы почти никогда не захотите возиться с objc_msgSend напрямую. Это все равно что прихлопывать мух палашом. Бывают случаи, когда вы хотите его использовать, но они очень особенные.

2. Не objc_msgSend() ли это более или менее то же самое, что -performSelector:withObject: , но с меньшими накладными расходами? (Искренне любопытно.)

3. @Алекс Рейнольдс: В определенной степени. Дело в том, что objc_msgSend он более гибкий, и им легче злоупотреблять, не осознавая этого, поэтому использовать его напрямую — это своего рода плохая привычка. Возможно, моя формулировка была немного резкой, но я не хочу видеть, как невинные пользователи Google без необходимости стреляют себе в ногу.

4. Есть ли у вас примеры того, как это может быть использовано не по назначению? Теперь мне действительно любопытно. Я понятия не имел, что это считается некорректным.

5. @Алекс Рейнольдс: Как насчет случаев, в которых objc_msgSend_stret было бы более уместно? Если вы начнете рассматривать эти угловые случаи, вы, возможно, изначально не выполнили цель использования Obj-C. 🙂