Возможно, что-то больше как это?
declare @UpdateTime datetime
set @UpdateTime = getutcdate()
update Table1 set AlertDate = @UpdateTime where AlertDate is null
select ID from Table1 where AlertDate = @UpdateTime
По сути, performSelector позволяет вам динамически определять, какой селектор вызывать селектор для данного объекта. Другими словами, селектор не нужно определять до выполнения.
Таким образом, даже если они эквивалентны:
[anObject aMethod];
[anObject performSelector:@selector(aMethod)];
Вторая форма позволяет вам сделать это:
SEL aSelector = findTheAppropriateSelectorForTheCurrentSituation();
[anObject performSelector: aSelector];
перед отправкой сообщения.
@ennuikiller на высоте. По сути, динамически сгенерированные селекторы полезны, когда вы не знаете (и обычно не можете) знать имя метода, который вы будете вызывать при компиляции кода.
Одно из ключевых отличий заключается в том, что -performSelector:
и его друзья (включая многопоточные и отложенные варианты ) несколько ограничены тем, что они разработаны для использования с методами с параметрами 0–2. Например, вызов -outlineView: toolTipForCell: rect: tableColumn: item: mouseLocation:
с 6 параметрами и возвращение NSString
довольно громоздко и не поддерживается предоставленными методами.
Селекторы немного похожи на указатели функций в других языках. Вы используете их, когда во время компиляции не знаете, какой метод вы хотите вызвать во время выполнения. Также, как и указатели на функции, они инкапсулируют только глагольную часть вызова. Если у метода есть параметры, вам также необходимо передать их.
NSInvocation
служит аналогичной цели, за исключением того, что он связывает воедино больше информации. Он не только включает глагольную часть, но также включает целевой объект и параметры. Это полезно, когда вы хотите вызвать метод для определенного объекта с определенными параметрами не сейчас, а в будущем. Вы можете создать соответствующий NSInvocation
и запустить его позже.