2014-01-10 2 views
1

При создании протокола говорят:используя <ProtocolName> при создании протоколов

@protocol EBSoundViewProtocol <NSObject> 

- (void)playSoundPressed; 
- (void)soundHintPressed; 
- (void)crossOutLettersHintPressed; 
- (void)fillInLettersHintPressed; 
- (void)solveSoundHintPressed; 

@end 

, а затем создать свойство делегата в моем классе, она должна выглядеть так:

@property (strong, nonatomic) id delegate; 

или как это:

@property (strong, nonatomic) id<EBSoundViewProtocol> delegate; 

, потому что я не могу понять различия и я не проверял, но я думаю, что первый работает отлично, так почему бы мне нужно ?

+2

Немного не по теме, но свойства делегирования обычно должны быть слабыми ссылками. –

ответ

2

Грейди Игрок прав; бит в скобках просто указывает, что объект должен соответствовать протоколу. Если вы добавите <EBSoundViewProtocol>, вы получите предупреждения для любых необходимых, но не реализованных методов протокола.

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

@protocol EBSoundViewProtocol <NSObject> 

- (void)playSoundPressed; 
- (void)soundHintPressed; 

@optional 

- (void)crossOutLettersHintPressed; 
- (void)fillInLettersHintPressed; 
- (void)solveSoundHintPressed; 

@end 

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

Если Вы отпустите <EBSoundViewProtocol>, вы, вероятно, следует обернуть любые вызовы делегата с вызовом -respondsToSelector: вместо того, чтобы убедиться, что этот метод был реализован:

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

В любом случае работает отлично.

О, и, как отметил Рене, вы должны, вероятно, сделать свои свойства делегата слабыми, а не сильными, чтобы избежать удержаний циклов.

1

Оно должно быть:

@property (strong, nonatomic) id<EBSoundViewProtocol> delegate; 

как это говорит компилятору, что делегат реализует протокол EBSoundViewProtocol

+0

не будет работать без ? –

+0

В любом случае работает, хотя вы, вероятно, захотите использовать -ответчикToSelector: перед вызовом делегата, если вы оставите идентификатор протокола выключенным. – atticus

2
@property (strong, nonatomic) id<EBSoundViewProtocol> delegate; 

потому, что даст вам предупреждение для:

obj.delegate = @"clearly doesn't adopt that protocol"; 
+0

, но это всего лишь проверка компилятора, она не имеет никакого отношения к времени выполнения, просто хороший механизм корректности типа Duck-). –

Смежные вопросы