Подтвердить что ты не робот

Не реализованный метод делегата приводит к сбою

Я создал протокол и назначил ему объект-делегат

@protocol AppBrainDelegate <NSObject>
@optional
- (void)didLocateUser;
- (void)didFinishLoadingDataWithData:(NSDictionary *)fetchedData;
@end

@interface Brain : NSObject
@property (strong, nonatomic) id <AppBrainDelegate> delegate;

Я думал, что смысл этого @optional в объявлении протокола означает, что контроллерам не нужно слушать метод делегата, если они этого не хотят.

Здесь журнал сбоев, если не реализует первый из методов делегата в контроллере. Если я это сделаю, я не потерплю краха. Похоже, я не понял концепцию объявления методов делегата как необязательного. Можете ли вы объяснить мне, где моя ошибка?

* Завершение приложения из-за неотображенного исключения "NSInvalidArgumentException", причина: '- [EventViewController didLocateUser]: непризнанный селектор, отправленный экземпляру 0x1fb300'

4b9b3361

Ответ 1

@optional просто подавляет предупреждение компилятора, если метод не реализован в классе, который соответствует протоколу. Перед вызовом метода делегата вам все равно нужно проверить, выполняет ли его делегиант:

if ([delegate respondsToSelector:@selector(didLocateUser)]) {
    [delegate didLocateUser];
}

Кстати, вы создали свое свойство delegate с помощью семантики strong. Если у вас есть особенно веская причина использовать strong, делегаты должны быть weak, так как ваш класс Brain не имеет своего делегата (если вы думаете о графе объектов).