으음; -_-); 신경 많이 안쓰고 몇자 적겠습니당; 가입했으니까; 기념으로 ㅋㅋㅋ 보통 이런거 잘 안하거든요;

Delegate이 자기가 할일 안하고 결국 내가할일을 정보부족(instance variables?)이라던지 기능부족이라던지 해서 다른 객체에 위임하는건데요. 예를 들어서...

@interface SWAwesomeGeek
:                   NSObject 
{
@private
EXTool     *tool;
EXWorkspace *workspace;
}
- (void)prepareWorkspace;
- (void)doSomethingNiceWithTool;
- (void)cleanUpWorkspace;
@end
-------------- [End of SWAwesomeGeek] ----------------

//여기서부터 외부 라이브러리
//header
@interface EXTool
:       NSObject
{
}

- (void)doSomethingUseful;
@end

//implementation
#pragma mark -
#pragma mark Private Methods

@interface EXTool (Private)
- (void)prepareDefaultWorkspace;
@end

우선 EXTool은 외부 라이브러리라서 수정 불가능하다고 치고요. doSomethingUseful를 실행할려면 EXWorkspace를 준비, 청소를 전후로 해줘야한다고 할때, EXTool은 EXWorkspace가 어떡해 기본셋팅이 되어야하는지 모른다 칩시다. 그리고 SWAwesomeGeek은 EXWorkspace를 준비, 청소할수 있는 정보가 다 있고요. 그럼 EXTool 입장에서는 자기가 할수 없는 일이니까 그쪽 부분은 다른 객체에게 위임할 수 밖에 없습니다. 위의 코드로는 아무것도 할수 없겠죠. 그래서 외부라이브러리는 Protocol을 선언해줘야 합니다. 수정을 적당히 해보면 다음과 같겠죠.

//header
@protocol EXToolDelegate; //forward declaration

@interface EXTool
:     NSObject
{
@private
id <EXToolDelegate> toolDelegate;
}
@property (nonatomic, assign) id <EXToolDelegate> toolDelegate;

- (void)doSomethingUseful;
@end

@protocol EXToolDelegate
<
   NSObject     //이거 안해주면 안돌아가요.
>
@optional
- (void)toolWillDoSomethingUseful:(EXTool *)tool;
@required
- (void)toolDidSomethingUseful:(EXTool *)tool;
@end

//implementation
#pragma mark -
#pragma mark Private Methods

@interface EXTool (Private)
- (void)prepareDefaultWorkspace;
@end

@implementation EXTool
@synthesize toolDelegate;

- (void) prepareDefaultWorkspace:(EXWorkspace *)workspace {
//setup default workspace
}

- (void) doSomethingUseful {
        //delegate이 아예 없어도 되는 경우면 이런거 필요 없겠죠.
NSAssert(toolDelegate, @"cannot proceed without delegate");

//optional이니까 한번 체크 해주시고...
if ( [toolDelegate respondsToSelector:@selector(toolWillDoSomethingUseful:)] ) {
[toolDelegate toolWillDoSomethingUseful:self];
} else {
[self prepareDefaultWorkspace];
}

//do it now

//required니까 걍 불러주면 됩니다.
[toolDelegate toolDidSomethingUseful:self];
}
@end
------------------ [end of EXTool] -------------------

//SWAwesomeGeek 생략

NSObject은 같은 이름으로 class 도 있고요 protocol도 있습니다. protocol inheritance로 위와 같이 EXToolDelegate 의 상위 protocol 만들어줘야 합니다. optional method는 respondsToSelector로 있나없나 확인해야 하니까요. 어디서 본건데 NSObject <EXToolDelegate> toolDelegate; 과 같이 선언하면 안되냐?고 하는데, 우선 정상적인 방법은 아니고요. 또, type casting이니 모니 생각해야하니까 -_- id가 낮죠. Objective-C 자체에서 Java처럼 Object이 모든 객체에 어머니다~~라고 하지 않거든요... NSObject 객체 대신 NSObject 프로토콜을 이용해서 정식 API호환 가능한 "모든 객체의 어머니"를 만들 수도 있으니까... (미친짓 같지만;;;) 또 뭐... 메모리 관리를 알아서 해주는 객체를 만든다 던지.... -_-)> 하여튼... 생각보다 많이 썼습니다. ㅋㅋㅋ 도움 됬길 바랍니다.

이 게시물을..