У меня есть метод, который зависит от одного вызова метода внутри, и я хотел бы передать метод/подпись метода, который он меняет в качестве аргумента... это возможно в Objective C, или это тоже на что надеяться?
Можно ли передать метод в качестве аргумента в Objective-C?
Ответ 1
NSInvocation - это класс для обработки вызовов метода в объекте. Вы можете установить селектор (подпись метода), задать аргументы по индексу. Затем вы можете установить цель и вызвать вызов, чтобы вызвать вызов, или оставить цель отключенной и использовать invokeWithTarget: в некотором цикле для вызова этого для многих объектов.
Я думаю, что это немного похоже на это:
NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];
for (MyClass *myObj in myObjects) {
  [inv invokeWithTarget:myObj];
}
Или если вы не хотите передавать объекты вызова в этот метод, вы можете использовать тип SEL, чтобы принять селектор (подпись метода).
-(void)fooWithMethod:(SEL)selector;
Затем назначьте селектор объекту-вызовом, чтобы вызвать его на объектах.
Ответ 2
Или, если вы используете подход fooWithMethod:(SEL)selector, просто сделайте [myObject performSelector:selector] на нем, если у него нет других аргументов.
Подробнее см. NSObject.
Ответ 3
Как уже говорилось, вы можете передать селектор метода, который хотите вызвать. С помощью селектора существуют разные способы вызова метода:
-  с помощью методов 
NSObjectperformSelector:,performSelector:withObject:иperformSelector:withObject:withObject: -  с помощью объекта 
NSInvocation -  или напрямую используя 
objc_msgSendилиobjc_msgSend_stret -  с помощью 
IMPэтого метода, который вы можете использовать с помощьюmethodForSelector: 
Какой из них действительно зависит от ситуации. Если производительность не является критичной, Id следует 1, если вам нужно передать 0, 1 или 2 объекта. Если методы performSelector:... не совпадают с Id, перейдите с 2 или 3. Поскольку для настройки объекта NSInvocation требуется много кода шаблона, я предпочитаю 3, но, я думаю, это вопрос личного выбора, если не возникают проблемы с производительностью.
Если производительность этих вызовов метода имеет значение Id, используйте 3 или 4. 3 должно быть быстрее, если вы не можете кэшировать IMP s. Но в зависимости от вашего кода это может оказаться невозможным или не поможет. Итак, здесь вы должны профилировать код и посмотреть, какой из них лучше для вас.