не реализованный метод делегата приводит к сбою
Я создал протокол и назначил его объекту делегата
@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"
1 ответов
на @optional
просто подавляет предупреждение компилятора, если метод не реализуется в классе, который соответствует протоколу. Перед вызовом метода делегата вам все равно нужно проверить, что делегат реализует его:
if ([delegate respondsToSelector:@selector(didLocateUser)]) {
[delegate didLocateUser];
}
Кстати, вы создали свойство делегата, используя strong
семантика. Если у вас нет особенно веской причины использовать strong
делегаты должны быть weak
, поскольку Brain
класс не собственные его представителя (если вы думаете об объекте graph).