2012-05-06 2 views
0

Я хочу прояснить концепцию делегата и протоколов в объективе c. Таким образом, существует два типа протоколов 1) Формальные 2) НеофициальныеЦелью делегатов и протоколов

В случае официального делегата .. то, что если человек определен метод протокола, но на самом деле не реализованы его в обоих. i.e Класс B является делегатом A и A имеет метод WindowDidMove как необязательный ... в этом случае. Каково было бы поведение? и необходимо ли реализовать функцию делегата в классе b. я не могу просто реализовать его в A и использовать его везде, где хочу ... и, наоборот, не определять его в A и давать отдельные реализации в B или классе C или D и использовать их, но я хочу ... прошу пояснить этот момент - @ класс A;

@protocol ADelegate <NSObject> 
@optional 

- (BOOL)A:(A *)foo doSumfin:(BOOL)decide; 

@end 

@interface A : NSObject { 
NSString *bar; 
id <ADelegate> delegate; 
} 

@property (nonatomic, retain) NSString *bar; 

@property (nonatomic, assign) id <ADelegate> delegate; 

- (void)someAction; 

@end 

Кроме того, что делает линии

id <A Delegate > delegate; 

@property (nonatomic, assign) id <ADelegate> delegate; 

помогают нам достичь ..

в случае неофициального протокола ... если я не дать реализацию для метода и еще вызовите метод делегата ... что произойдет?

ответ

2

Если вы вызываете метод делегата, который не выполняет ваш делегат, это приведет к исключению. Для дополнительных методов делегата, вы, как правило, проверить, если делегат осуществляет их проверку первой, если делегат отвечает на него:

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

Это не изменяет какой-либо образом с неофициальным протоколом. Не путайте неофициальные протоколы с опционными методами протокола. Неофициальный протокол обычно представляет собой только категорию NSObject и больше не должен использоваться.

+0

отредактируйте ответ, чтобы объяснить сценарий 2 также ... в случае формального протокола .. что делать, если я даю отдельные реализации для одного необязательного метода в разных классах также, что произойдет, если я дам реализацию в класс протокола и хотите использовать это везде. пожалуйста, очистите этот пункт –

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

  • Нет связанных вопросов^_^