Семейство методов performSelector
предназначено для особых случаев, подавляющее большинство вызовов методов в Obj-C должно быть прямым. Некоторые отличия:
Непрямой: При использовании метода performSelector
для вызова метода у вас есть два метода вызова; значение performSelector
и целевой метод.
Аргументы являются объектами: При вызове через performSelector
все аргументы должны передаваться как объекты, например. при вызове метода, который принимает значение double
, тогда это значение должно быть обернуто как NSNumber
перед передачей performSelector
. Методы performSelector
разворачивают необязательные аргументы перед вызовом целевого метода. При прямом вызове не требуется упаковка или разворачивание.
только два аргумента:performSelector
семейство включает в себя только варианты, которые проходят 0, 1 или 2 аргумента, так что вы не можете использовать их, чтобы вызвать метод, который принимает 3 или более аргументов.
Вероятно, вы видите большинство из вышеперечисленных как негативы, так в чем преимущества?
Динамического селектор:performSelector
семьи позволяет вызывать метод, который не известен до момента выполнения, только его типа должен быть известен (так что вы можете передать правильные аргументы и получить правильный результат); другими словами, аргументом селектора может быть выражение типа SEL
. Это можно использовать, если вы хотите передать метод в качестве аргумента другому методу и вызвать его. Однако, если вы компилируете ARC с помощью динамических селекторов, является нетривиальным и обычно выдает предупреждения компилятора, так как, не зная, что селектор ARC не может знать атрибуты собственности аргументов.
Отложенное исполнение: Семейство performSelector
включает методы, которые вызывают метод после задержки.
В общем случае использование прямого вызова метода, только если это не дает вам то, что вам нужно, вам необходимо рассмотреть семейство performSelector
(или его еще более эзотерических родственников).
Последний более гибкий, поскольку он позволяет вам поставлять более двух параметров (выполнитьSelector: withObject: withObject :). – Till
Но мы можем передать десятки объектов, упакованных в массив, как 1 параметр. –
@AnoopVaidya yikes, DONT. Для таких сценариев используется «NSInvocation». – Till