не реализованный метод делегата приводит к падению - PullRequest
12 голосов
/ 26 января 2012

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

@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 Ответ

36 голосов
/ 26 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...