делегаты и протоколы цели

Я хочу пояснить концепцию делегата и протоколов в цели c. Итак, существует два типа протоколов: 1) формальный 2) неформальный.

В случае формального делегата ... что, если человек определил метод протокола, но ДЕЙСТВИТЕЛЬНО не реализовал его в обоих. То есть класс B является делегатом A, а метод WindowDidMove является необязательным ... в этом случае. каково было бы поведение ??? и необходимо ли реализовать функцию делегата в классе b. не могу ли я просто реализовать его в A и использовать везде, где я хочу ... и, наоборот, не определять его в A и давать отдельные реализации в B или классе C или D и использовать их, как я хочу ... пожалуйста, поясните этот момент - @ класс А;

@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;

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

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


person Izac Mac    schedule 06.05.2012    source источник


Ответы (1)


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

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

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

person omz    schedule 06.05.2012
comment
пожалуйста, отредактируйте ответ, чтобы также объяснить сценарий 2 ... в случае формального протокола ... что, если я дам отдельные реализации для одного необязательного метода в разных классах, а также что произойдет, если я дам реализацию в классе протокола и хочу использовать это везде. пожалуйста, очистите и этот момент - person Izac Mac; 08.05.2012