Протоколы
Документация: Протоколы
Протоколы - это интерфейсы, которые определяют определенные методы, на которые отвечают объекты. Ключевым моментом в протоколах является то, что они могут быть приняты любым классом, гарантируя, что объект отвечает на эти методы.
Если вы объявляете протокол:
@protocol Photosynthesis
@required
- (void)makeFood:(id<Light>)lightSource;
@optional
+ (NSColor *)color; // usually green
@end
Затем вы можете перенять его из других классов, которые не обязательно связаны напрямую:
@interface Plant : Eukaryote <Photosynthesis>
// plant methods...
@end
@implementation Plant
// now we must implement -makeFood:, and we may implement +color
@end
или
@interface Cyanobacterium : Bacterium <Photosynthesis>
// cyanobacterium methods...
@end
@implementation Cyanobacterium
// now we must implement -makeFood:, and we may implement +color
@end
Теперь, в другом месте, мы можем использовать любой из этих классов взаимозаменяемо, если мы заботимся только о соответствии протоколу:
id<Photosynthesis> thing = getPhotoautotroph(); // can return any object, as long as it conforms to the Photosynthesis protocol
[thing makeFood:[[Planet currentPlanet] sun]]; // this is now legal
Делегаты и уведомления
Документация: Шаблоны проектирования какао
Это два способа передачи сообщений между объектами. Основное отличие:
- с делегатами, один назначенный объект получает сообщение.
- любое число объектов может получать уведомления при их публикации.
Делегаты обычно реализуются с использованием протоколов: класс обычно имеет что-то вроде
@property (weak) id<MyCustomDelegate> delegate;
, который дает делегату определенный набор методов для реализации. Вы можете использовать
myObject.delegate = /* some object conforming to MyCustomDelegate */;
и тогда объект может отправлять соответствующие сообщения своему делегату. Хороший общий пример см. В протоколе UITableViewDelegate .
Уведомления, с другой стороны, реализуются с использованием NSNotificationCenter . Объект (или несколько объектов) просто добавляет себя в качестве наблюдателя для определенных уведомлений, а затем может получать их, когда они публикуются другим объектом.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(notificationHappened:)
name:MyCustomNotificationName
object:nil];
Тогда просто реализуй
- (void)notificationHappened:(NSNotification *)notification {
// do work here
}
И вы можете отправлять уведомления из любого места, используя
[[NSNotificationCenter defaultCenter] postNotificationName:MyCustomNotificationName
object:self
userInfo:nil];
И обязательно позвоните removeObserver:
, когда закончите!