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