Проверка того, был ли реализован необязательный метод протокола

Кто-нибудь знает, как лучше всего проверить, был ли реализован необязательный метод протокола.

Я пробовал это:

if ([self.delegate respondsToSelector:@selector(optionalProtocolMethod:)] )

где делегат:

id<MyProtocol> delegate;

Однако я получаю сообщение об ошибке, говорящее о том, что функция respondsToSelector: не найдена в протоколе!


person Nick Cartwright    schedule 04.02.2009    source источник


Ответы (2)


respondsToSelector: является частью протокола NSObject. Включение NSObject в MyProtocol должно решить вашу проблему:

@protocol MyProtocol <NSObject>

@optional
-(void)optionalProtocolMethod:(id)anObject;

@end
person Will Harris    schedule 04.02.2009
comment
За исключением того, что вы не должны удерживать своих делегатов, так почему вы звоните [освобождение делегата]? - person SilverSideDown; 17.07.2012
comment
Чтобы быть справедливым по отношению к grilix, есть ситуации, когда делегат должен быть сохранен. - person Mike Weller; 14.10.2012
comment
@MikeWeller Любопытны варианты использования для сохранения делегата. Есть примеры, почему вы бы это сделали? - person memmons; 27.03.2013

Что я делаю, так это применяю следующий рецепт:

if(self.delegate && [self.delegate respondsToSelector:@selector(closed)]){
    [self.delegate closed];
}

Где «закрытый» — это метод, который я хотел вызвать.

person Javier Calatrava Llavería    schedule 10.05.2015
comment
Это перебор? Если делегат не существует. [self.delegate responsesToSelector:@selector(closed)] вернет ноль. - person Alex; 25.08.2020