синтаксис @selector - PullRequest
       16

синтаксис @selector

2 голосов
/ 27 июня 2011

нормально, без использования NSInvocation, допустим, у меня есть этот код:

...
array = [NSMutableArray arrayWithObjects:@"Yoda", @"Jedi", @"Darth Vader", @"Darth Vader", @"Darth Vader" , @"Darth Vader", nil];

SEL removeObjectMessage = @selector(removeObject:inRange:);

//does array allow us to remove and object in a range? if so let's do this    
if ([array respondsToSelector:removeObjectMessage]){   
    NSRange darthVaderRange=NSMakeRange(2, 3);
    [array removeObject:@"Darth Vader"inRange:darthVaderRange];
}

как бы я выполнил эту последнюю строку в форме SEL removeObjectMessage? Я должен был бы поместить обертку вокруг диапазона? Я просто хочу посмотреть, как будет выглядеть весь этот беспорядок ...

Ответы [ 3 ]

2 голосов
/ 27 июня 2011

Вы можете сделать:

if ([array respondsToSelector:removeObjectMessage]){   
    NSRange darthVaderRange=NSMakeRange(2, 3);
    objc_msgSend(array, removeObjectMessage, @"Darth Vader", darthVaderRange);
}

Хотя это кажется довольно хрупким ...

1 голос
/ 27 июня 2011

Не существует метода, который позволял бы передавать аргументы селектора и необъекта и получать действительный вызов метода. Если бы это был метод, который принимает только аргументы объекта, вы бы сделали [array performSelector:removeObjectMessage withObject:@"Darth Vader" withObject:someHypotheticalRangeObject].

Но чтобы сделать это с NSRange, вам придется либо использовать NSInvocation (что вы сказали, что вы не хотите делать), либо создать категорию на NSObject и использовать низкоуровневые функции времени выполнения Objective C для определить метод, который принимает селектор, аргумент объекта и не-объектный аргумент и вызывает соответствующий метод.

1 голос
/ 27 июня 2011

К сожалению, если вы передаете аргумент, который не относится к типу id, вы должны использовать объект NSInvocation.(В противном случае вы можете использовать performSelector:withObject:withObject:.)

...