Делегаты в цели c

2

Сначала я должен сказать вам, что небольшое знание Objective C или С#. Так когда один из моих коллег спросил меня, есть ли что-то вроде делегатов в Objective C, я задавался вопросом, существует ли такая концепция в Objective-C. Я думаю делегаты, которые мы используем в программировании iphone, не совпадают. # делегаты - это указатели на функции? Такое средство было бы неплохо иметь при работе с несколькими видами. Где я могу найти информацию?

  • 0
    C # Делегаты не являются указателями на функции, хотя они служат одной и той же цели и ведут себя похожим образом.
  • 0
    Если вам нужны указатели на функции в Objective C, вы можете использовать тип SEL, который делает то же самое. то есть: SEL mymethod = @selector (dosomething: with :);
Показать ещё 1 комментарий
Теги:
delegates
cocoa

2 ответа

14
Лучший ответ

Делегаты в Objective-C - это просто концепция, а не какой-то артефакт реализации (например, на С#). Делегат в Objective-C (лучше: Cocoa) - это в основном объект, который уведомляется тем, кто использует его в качестве своего "делегата" определенных событий. Делегатам также может быть предложено выполнить определенные задачи от имени объекта-хозяина. Интерфейс, который должен выполнять делегат, часто формализуется протоколом.

@protocol ActionDelegate 

- (void) actionDidStart: (id) aSender;
- (void) actionDidEnd: (id) aSender;

@end

@interface Action: NSObject {
    id<ActionDelegate> delegate;
}

@property (nonatomic,assign) id<ActionDelegate> delegate;

@end

Делегаты в С#, с другой стороны, являются артефактом реализации. Существует специальное ключевое слово delegate, чтобы объявлять типы делегатов и создавать фактические экземпляры делегатов.

class Action {

    delegate void ActionDidStartDelegate(Action sender);
    delegate void ActionDidEndDelegate(Action sender);

    ...
}

(мой С# немного ржавый, поэтому синтаксис может быть здесь, извините, и в реальной жизни можно было бы, вероятно, использовать события в ситуациях, подобных выше, а не сырым делегатам). В принципе, делегат С# похож на объект метода Python.

Возможно, вы сможете использовать функцию нового кодового блока Objective-C для эмуляции делегатов. Не используя эту функцию (пока), я не могу комментировать это. Другим способом получить что-то подобное было бы использование простых указателей функций.

typedef void (*callback_function)();

- (void) doSomethingWithCallback: (callback_function) func {
    ...
    func();
}

И, конечно же, вы всегда можете использовать метод, который часто используется самим Cocoa: используйте объект и связанный с ним селектор методов:

- (void) doSomethingWhenDonePerform: (SEL)aSelector onObject: (id) aReceiver {
    ...
    [aReceiver perform: aSelector];
}
  • 0
    "Делегат C # сродни указателю на функцию-член в C ++" Нет, это не так. Указатель на функцию-член в C ++ похож на SEL в Objective C, требующий вызова экземпляра объекта. Делегат AC # инкапсулирует как экземпляр объекта, так и вызываемый метод в одной ссылке.
  • 0
    @ Даниель: Спасибо. Исправлено Еще одна вещь, которую я не использовал в течение достаточно долгого времени ...
Показать ещё 1 комментарий
6

делегаты С# - это что-то вроде NSInvocations в Objective-C:

  • каждый знает объект, который будет объектом вызова
  • каждый знает метод, который будет называться

однако, NSInvocation идет дальше:

  • он знает аргументы для перехода к методу
  • он может сохранить возвращаемое значение

Вероятно, вы не использовали бы NSInvocation для реализации шаблона, такого как делегаты С# (которые являются формой прокси-шаблона). Лично я бы решил использовать объект, который пересылает сообщения, которые он получает целевому объекту, используя стандартные функции пересылки сообщений во время выполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню