2015-09-01 1 views
0

У меня есть протоколПроверить недвижимость в respondsToSelector

@protocol ListPickerCellDelegate <NSObject> 
@property (nonatomic, strong) TAActivity *activity; 
@end 

Я хочу проверить делегат на его собственность. Как мне это сделать?

Мой код, не уверен, что это нормально

if (!self.delegate || ![self.delegate respondsToSelector:@selector(activity))]) { 

} 
+0

Что "проверить делегата на его собственность" означает? – jtbandes

+0

это означает, что мой делегат имеет его свойство или нет. –

+0

Я думаю, что вы имели в виду, если (self.delegate && [self.delegate отвечает ....]), но весь смысл использования протокола заключается в том, что вам не нужно это делать , Компилятор сообщит вам, предоставит ли ваш делегат обязательные свойства. –

ответ

2

Согласно комментариям:

Вы только должны проверить наличие реализации, если

  • объект является необязательным или
  • вы получаете экземпляр и не знаете, реализует ли его класс протокол.

Если это так:

Прежде всего позвольте мне переписать применение De Morgan:

if(!(self.delegate && [self.delegate respondsToSelector:@selector(activity)])) 
{ 
    … 
} 

Я не очень понимаю это, потому что вы проверить, есть ли нет метод activity ? Обычно это наоборот, и вы хотите знать, есть ли он перед его использованием.

Однако, если это self.delegatenil, [self.delegate respondsToSelector:…] будет возвращать NO (определенное сообщение всухую поведение) и все && выражения будет оценивать с NO независимо от первого условия. Поэтому бессмысленно проверять nil.

Просто написать:

if(![self.delegate respondsToSelector:@selector(activity)]) 
{ 
    // Do not use activity 
} 
else 
{ 
    TAActivity *activity = [self.delegate activity]; 
} 

(я действительно хотел повернуть, что вокруг.)

-2

Просто проверьте, если activity является NULL

+0

Это вызовет исключение, если '-activity' не будет реализован. Весь Q странный. –

+0

Да, я думал, что это тоже довольно странно. Думаю, я должен был это сказать. Если он не будет реализован, ему не нужно будет «проверять» его, потому что он выдаст ошибку. Я решил, что его вопрос был больше о том, был ли он инициализирован. –