Динамический вызов метода в Objective-C - PullRequest
6 голосов
/ 11 июня 2011

Как я могу вызвать селектор с его именем в NSString * в цели c? Мне также нужно вызывать селектор, только если цель примет его. например,

+(void) callMethod: (NSString *) method onObject: (id) object
{
    // do some magic
}

Когда я вызываю callMethod: @"Foo" onObject: obj, если obj реализует Foo, тогда следует вызывать [obj Foo], если это не реализуется, ничего не должно происходить.

Ответы [ 2 ]

15 голосов
/ 11 июня 2011
SEL selector = NSSelectorFromString(method);
if ([object respondsToSelector:selector]) {
    [object performSelector:selector];
}
6 голосов
/ 11 июня 2011

Сначала вы используете метод NSSelectorFromString() для преобразования строки в имя метода, например:

SEL methodToCall = NSSelectorFromString(stringToConvertToMethod);

Затем вы проверяете метод на получателе и вызываете метод, если он существует:

if ([receiver respondsToSelector:methodToCall]) {

  //  Method exists, call it.
  [receiver performSelector:methodToCall];

}

Просто отметьте, что потенциальным недостатком является то, что вы не сможете передавать аргументы. Для передачи аргумента вы должны вызвать метод NSObject performSelector:withObject:. Для передачи двух аргументов, performSelector:withObject:withObject:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...