'Objective-C'에 해당되는 글 11건

  1. 2009.06.15 Objective-C : Categories 2/2
반응형
Category의 활용에 대해서 좀더 자세히 알아보자

1) Category를 이용하여 Implementation을 분리하는 경우
 일반적으로 interface 선언은 header 파일에, 구현은 .m 파일에 담는게 되며 @implementation 코드를 여러 .m 파일이 존재하게 할수는 없다.  예를 들어 AppKit 의 NSWindow의 경우에 수백가지의 메소드를 가지고 있다. 이이 대한 구현을 하나의 파일에 놓는 다는 것은 유지 보수 측면 및 관리 측면에서 좋은 방법은 아니다. 
따라서 NSWindow는 여러 category로 분류되어 있으며 구현 파일 역시 분리 되어 있다. category를 이용한 구현 파일 분리는 다음의 예로 설명한다.
왼쪽은 본 예의 파일 구성이다. CategoryUse1.m에는 Main 함수가 있으며 Thing1.h 에는 interface 및 category 정의가 있다.
Thing1.m에는 CategoryThing 에 대한 description이 구현되어 있으며 thingim1,2,3에는 각각의 Category의 메소드를 구현한다.




- thing1.h (클래스 및 카테고리 선언)

-thing1.m (클래스 메소드 구현)

카테고리 메소드 구현
-thingim1.m                                                        -thingim2.m
-thingim3.m

- CategoryUse1.m (메인 함수)


컴파일 및 실행이 정상적으로 됨을 확인 가능하다.

2) Informal Protocols and Delegation Categories
- Delegation
Cocoa 클래스는 다른 Object에게무엇인가를 하도록 해야할 경우 "Delegate"를 이용한다. 다음의 예는 NSNetServiceBrowser에 ITunesFinder 클래스를 Delegate로 설정하여 NSNetServiceBrowser에서 특정 이벤트 발생시 ITunesFinder 클래서에서 구현한 메소드를 호출하도록 하는 것이다.
  Main.m
NSNetServiceBrowser 코코아 클래스는 Bonjour에 의해서 제공되는 네트워크 서비스를 찾도록 해주는 클래스이다. NSNetServiceBrowser에 찾고자 하는 서비스를 등록하면 새로 등록된 서비스가 존재하면 delegate object에 message를 보낸다. 
_daap 는 "Digital Audio Access Protocol"의 약자고 _tcp 는 TCP Protocol을 의미한다. .local은 로컬 네트워크를 의미한다. [[NSRunLoop currentRunLoop] run] 부분에서는 어떤 이벤트가 발생하기 전까지 Block 되어 있게 된다. 

다음은 Delegate 클래스 구현이다
 ITunesFinder.h

 ITunesFinder.m


delegate 클래스는 delegate 하는 클래스(NSNetServiceBrowser)의 특정 메소드를 구현해야 한다. NSNetServiceBrowser 에서는 delegation 시에 netServiceBrowser 메시지를 delegate 클래스에 보내게 되는데 이때 전달 인자로 NSNetServiceBrowser 포인터와, (NSNetService) 그리고 (BOOL) 을 전달한다. NSNetService는 새로 도착한 서비스를 의미하고 BOOL값은 더 도착할 메시지가 있는지를 나타낸다. [service resolveWithTimeout:10] 은 Bonjour시스템이 service에 대한 정보를 가져오도록 한다.

- Delegates and Categories
 Delegates 를 위한 함수는 Category를 이용하여 선언된다. 다음은 NSNetService의 delegate methods 선언들이다.

@interface NSObject (NSNetServiceBrowserDelegateMethods)
...
-(void) netServiceBrowser:
(NSNetServiceBrowser *) aNetServiceBrowser
didFindService: (NSNetService *) service
moreComing: (BOOL) moreComing:
...
@end

NSObject의 category로 선언함으로  NSNetServiceBrowser는 어떤 객체에도 이 메시지를 보낼수 있게 된다. 어떤 객체든 이 메소드를 구현하게 되면 delegate가 가능하게 된다.

- imformal protocol
Category를 NSObject에 선언하는 것을 "informal protocol"을 생성한다고 한다.













반응형
Posted by alias
,