существует ли цель-c, "эквивалентная" методу отправки ruby? - PullRequest
4 голосов
/ 30 октября 2009

Я не уверен, что это возможно, но в ruby ​​вы можете динамически вызывать метод, используя send

например. если я хочу вызвать для объекта метод bar , foo , я могу использовать

foo.send("bar")

Есть ли способ сделать что-то подобное, используя target-c?

ТКС!

Ответы [ 3 ]

13 голосов
/ 30 октября 2009

Насколько я знаю, есть несколько вариантов

  1. Вы можете использовать метод NSObject performSelector:. Это, однако, действительно хорошо только для методов, у которых мало аргументов или нет аргументов.
  2. Используйте класс NSInvocation . Это немного тяжелее, но гораздо более гибко.
  3. Возможно, вы сможете использовать objc_msgSend(), но, вероятно, плохая идея вызывать его напрямую из-за других вещей, которые среда выполнения может делать за кулисами.
3 голосов
/ 30 октября 2009

Для общего использования (метод с возвращаемым значением и любым количеством аргументов) используйте NSInvocation :

if ([target respondsToSelector:theSelector]) {
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
        [target methodSignatureForSelector:theSelector]];
    [invocation setTarget:target];
    [invocation setSelector:theSelector];
    // Note: Indexes 0 and 1 correspond to the implicit arguments self and _cmd, 
    // which are set using setTarget and setSelector.
    [invocation setArgument:arg1 atIndex:2]; 
    [invocation setArgument:arg2 atIndex:3];
    [invocation setArgument:arg3 atIndex:4];
    // ...and so on
    [invocation invoke];
    [invocation getReturnValue:&retVal]; // Create a local variable to contain the return value.
}
0 голосов
/ 30 октября 2009
if ([foo respondsToSelector:@selector(bar)])
    [foo performSelector:@selector(bar))];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...