2012-05-06 2 views
0

객관적인 c에서 대리인 및 프로토콜의 개념을 명확히하고 싶습니다. 그래서 사람이 프로토콜 방법을 정의 실제로 모두를 구현하지 않은 경우 어떤 공식적인 위임의 경우대리인 및 프로토콜 목표

비공식 2 공식 프로토콜 1))의 두 가지 유형 ...이 있습니다. 즉 B 클래스는 A의 델리게이트이고 A는 WindowDidMove 메소드를 옵션으로 가지고 있습니다.이 경우. 무슨 행동이 될까요 ??? 클래스 b에서 대리자 기능을 구현해야합니다. 난 그냥 그것을 구현하고 어디서나 내가 원하는대로 그것을 사용할 수 없다 ... 그리고 반대로, A에서 정의하고 B 또는 클래스 C 또는 D 별도의 구현을 제공하고 그들을 사용하지만 나는 ...이 점을 명확히하십시오 - @class 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를 설명하는 대답도 편집하십시오 ... 정식 프로토콜의 경우 .. 다른 클래스의 단일 선택적인 메서드에 대해 별도의 구현을 제공하면 무엇입니까? 또한 구현을 제공하면 어떻게 될지 프로토콜 클래스와 다른 모든 곳에서 사용하고 싶습니다. 이 점을 분명히하십시오. –