Подтвердить что ты не робот

Можно ли передать метод в качестве аргумента в Objective-C?

У меня есть метод, который зависит от одного вызова метода внутри, и я хотел бы передать метод/подпись метода, который он меняет в качестве аргумента... это возможно в Objective C, или это тоже на что надеяться?

4b9b3361

Ответ 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

Как уже говорилось, вы можете передать селектор метода, который хотите вызвать. С помощью селектора существуют разные способы вызова метода:

  • с помощью методов NSObject performSelector:, 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. Но в зависимости от вашего кода это может оказаться невозможным или не поможет. Итак, здесь вы должны профилировать код и посмотреть, какой из них лучше для вас.