Цель C - NSInvocation передает себя в качестве отправителя?

Я пытаюсь использовать NSInvocation для вызова метода объекта и отправки sender в качестве аргумента. В приведенном ниже коде вызывается метод mthod, но кажется, что объект передается методу mthod, который на самом деле не является самостоятельным объектом.

- (void)setTarget:(id)taret withAction:(SEL)selector
{
    NSMethodSignature *methodSignature = [target methodSignatureForSelector:action];
    _invocation = [[NSInvocation invocationWithMethodSignature:methodSignature] retain];

    _invocation.target = target;
    _invocation.selector = action;
    [_invocation setArgument:self atIndex:2];
}

- (void)callTargetWithSender
{
   [_invocation invoke];
}

person aryaxt    schedule 19.07.2011    source источник
comment
Пожалуйста, не переписывайте свои вопросы полностью. Это создает путаницу позже, когда люди ищут и обнаруживают, что ответы больше не соответствуют вопросу. Если у вас есть новый вопрос, вы должны закончить первый вопрос, а затем задать новый вопрос.   -  person Rob Napier    schedule 19.07.2011


Ответы (3)



[вызов setArgument:(__bridge void *)(self) atIndex:2];

person user3176858    schedule 09.01.2014

Почему бы тебе просто не использовать

   [target performSelector:selector withObject:self];

??? Когда selector равно @selector(foo:), это эквивалентно

   [target foo:self];

NSInvocation в вашей ситуации это перебор, на мой взгляд.

person Yuji    schedule 19.07.2011
comment
Потому что для того, чтобы выполнить PerformSelector, мне нужно сохранить как селектор, так и цель, и у меня есть 1 объект (NSInvocation), который будет отвечать здесь. Я использую NSInvocation для хранения информации о методе в ДРУГОМ объекте, чтобы я мог вызывать его, когда захочу. - person aryaxt; 19.07.2011
comment
Нет ничего плохого в том, чтобы использовать для этого NSInvocation. Обратите внимание, однако, что создание NSInvocation безумно дорого. Примерно в 500 раз медленнее, чем вызов метода в моих тестах. Их не так дорого вызывать, просто создавать. В большинстве случаев это не проблема, но стоит помнить, если вы создаете их очень часто. Однако ваш вариант использования в порядке, и это то, для чего предназначен NSInvocation. NSInvocation также может обрабатывать произвольное количество параметров, в отличие от performSelector:... - person Rob Napier; 19.07.2011