Сначала я должен сказать вам, что небольшое знание Objective C или С#. Так когда один из моих коллег спросил меня, есть ли что-то вроде делегатов в Objective C, я задавался вопросом, существует ли такая концепция в Objective-C. Я думаю делегаты, которые мы используем в программировании iphone, не совпадают. # делегаты - это указатели на функции? Такое средство было бы неплохо иметь при работе с несколькими видами. Где я могу найти информацию?
Делегаты в 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];
}
делегаты С# - это что-то вроде NSInvocations
в Objective-C:
однако, NSInvocation
идет дальше:
Вероятно, вы не использовали бы NSInvocation
для реализации шаблона, такого как делегаты С# (которые являются формой прокси-шаблона). Лично я бы решил использовать объект, который пересылает сообщения, которые он получает целевому объекту, используя стандартные функции пересылки сообщений во время выполнения.