Используя NSInvocation

Создание NSInvocation объект требует нескольких шагов. Рассмотрите этот метод пользовательского класса MyCalendar:

– (BOOL)updateAppointmentsForDate:(NSDate *)aDate

updateAppointmentsForDate: берет NSDate возразите как его единственный параметр и возвраты YES или NO в зависимости от того, могли ли бы назначения быть обновлены без конфликтов. Контролирование фрагмента кода устанавливает NSInvocation объект для него:

SEL theSelector;
NSMethodSignature *aSignature;
NSInvocation *anInvocation;
 
theSelector = @selector(updateAppointmentsForDate:);
aSignature = [MyCalendar instanceMethodSignatureForSelector:theSelector];
anInvocation = [NSInvocation invocationWithMethodSignature:aSignature];
[anInvocation setSelector:theSelector];

Первые две строки добираются NSMethodSignature объект для updateAppointmentsForDate: метод. Последние две строки фактически создают NSInvocation объект и набор его селектор. Обратите внимание на то, что селектор может быть установлен в любой селектор, соответствующий подпись updateAppointmentsForDate:. Любой из этих методов может использоваться с anInvocation:

– (BOOL)clearAppointmentsForDate:(NSDate *)aDate
– (BOOL)isAvailableOnDate:(NSDate *)aDate
– (BOOL)setMeetingTime:(NSDate *)aDate

Прежде чем быть диспетчеризированным anInvocation должен иметь свою цель и набор параметров:

MyCalendar *userDatebook;    /* Assume this exists. */
NSDate *todaysDate;          /* Assume this exists. */
 
[anInvocation setTarget:userDatebook];
[anInvocation setArgument:&todaysDate atIndex:2];

setArgument:atIndex: устанавливает указанный параметр предоставленному значению. Каждый метод имеет два скрытых параметра, цель и селектор (чьи индексы 0 и 1), таким образом, первый параметр, который должен быть установлен, фактически в индексе 2. В этом случае todaysDate NSDate параметр updateAppointmentsForDate:.

Диспетчеризировать NSInvocation возразите, отправьте invoke или invokeWithTarget: сообщение. invoke только приводит к результату если NSInvocation объект имеет целевой набор. После того, как диспетчеризированный, NSInvocation объект содержит возвращаемое значение сообщения, который getReturnValue: производит:

BOOL result;
 
[anInvocation invoke];
[anInvocation getReturnValue:&result];

NSInvocation не поддерживает вызовы методов или с переменными числами параметров или с union параметры.

Сохранение объектов NSInvocation для более позднего использования

Поскольку NSInvocation объект должен не всегда сохранять свои параметры, по умолчанию он не делает так. Это может заставить объектные параметры, а также цель становиться недопустимыми, если они автоматически выпущены. Если Вы планируете кэшироваться NSInvocation объект или отгрузка это неоднократно во время выполнения Вашего приложения, необходимо отправить ему a retainArguments сообщение. Этот метод сохраняет цель и все объектные параметры, и копирует струны до так, чтобы они не были потеряны, потому что другой объект освобождает их.

Используя объекты NSInvocation с таймерами

Предположим NSInvocation объект, создаваемый выше, используется в приложении управления временем, позволяющем многочисленным пользователям устанавливать назначения для других, таких как встречи группы. Это приложение могло бы позволить календарю пользователя быть автоматически обновленным каждые несколько минут, так, чтобы пользователь всегда знал то, на что похоже его расписание. Такое автоматическое обновление может быть выполнено путем установки NSTimer объекты с NSInvocation объекты.

Данный NSInvocation объект выше, это столь же просто как вызов одного метода NSTimer:

[NSTimer scheduledTimerWithInterval:600
        invocation:anInvocation
        repeats:YES];

Эта строка кодовых наборов NSTimer возразите для диспетчеризации anInvocation каждые 10 минут (600 секунд). Обратите внимание на то, что NSTimer объект всегда сообщает NSInvocation объект сохранить его параметры; таким образом Вы не должны отправлять retainArguments самостоятельно. Посмотрите, что Таймер Программирует Темы для получения дополнительной информации о таймерах.