Объективный c - делегат и события

Я ищу хороший пример кода для использования делегата и событий в объекте c? Я знаком с делегатом и событиями на С#.

поэтому, если кто-то может помочь мне с несколькими строками кода, это будет очень полезно.

Ответы

Ответ 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. Фактически, вся страница имеет отношение к обеим частям вашего вопроса, поэтому я рекомендую ее высоко.

Ответ 2

Вышеуказанный ответ, безусловно, правильный. Однако, если вы ищете способ реализации шаблона издателя/подписчика, вы должны проверить NSNotificationCenter. Этот post имеет хороший пример.