Ответ 1
Селекторы (эквивалент делегатов С#)
Остерегайтесь, С# имеет термин "делегат" , а Objective-C имеет термин "делегат" , но у них почти нет ничего общего.
"Делегат" С# - это, по сути, указатель на функцию типа. Эквивалент указателя функции в Objective-C называется "селектором".
Чтобы объявить параметр, переменную-член или локальную переменную как селектор, объявите тип как SEL
. Например, в файле заголовка для класса NSTimer
вы можете найти этот метод:
- (id)initWithFireDate:(NSDate *)date
interval:(NSTimeInterval)seconds
target:(id)target
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats;
Это означает, что вы должны передать селектор в качестве четвертого аргумента при использовании этого метода. Вы можете назвать это следующим образом:
[[NSTimer alloc] initWithFireDate: someDate
interval: someInterval
target: self
selector: @selector(myTimerCallback:)
userInfo: nil
repeats: NO];
Как вы можете видеть, написав @selector(some-name-here)
, я могу построить новый селектор (подобно тому, как я могу построить новую строку, написав @"some text here"
). Objective-C методы имеют "дыры" в них, где вводятся аргументы, а этим отверстиям предшествуют двоеточия. При написании селектора, как указано выше, вы держите двоеточия, но вы удаляете все остальное. Например, вы можете написать что-то вроде @selector(firstPart:secondPart:thirdPart:)
.
Документация метода, который принимает селектор, обычно должна указывать, какой тип подписи разрешен. Компилятор НЕ выполнит это для вас (это очень отличается от делегатов С#).
Обратите внимание также, что описанный выше метод запрашивает параметр "target". Обычно это объект, на который будет вызываться селектор. Обратите внимание, что цель - полностью нетипизированная id
. Компилятор не пытается обеспечить, чтобы объект, который вы передавали, в качестве цели, фактически будет отвечать методу, указанному селектором. Если он не отвечает, то это ошибка времени выполнения. Это часть динамического характера Objective-C.
(Концепция "делегат" Objective-C - это просто шаблон делегата (посмотрите его), который очень распространен в Objective-C, часто используется там, где другие langauges будут использовать наследование.)
События и действия
Что касается событий, то класс NSEvent, но у меня еще нет опыта с ним. Это похоже на довольно низкую обработку событий GUI. Использование С# для событий, вероятно, более сродни "действиям" в Objective-C.
Как правило, компонент GUI такой кнопки имеет "действие" и "цель", связанные с ним. Вы можете установить их либо в коде, либо в Interface Builder. Цель, как объяснялось выше, - объект, на который будет вызываться метод. И "действие" на самом деле просто селектор.
Пожалуйста, прочитайте раздел "Механизм целевых действий" эту статью Cocoa Основы в документах Apple. Фактически, вся страница имеет отношение к обеим частям вашего вопроса, поэтому я рекомендую ее высоко.