[Cocoa Design Pattern] 17ch. Outlet, Target, Action

Jun 11, 2011/Jul 03, 2015
**![](http://ash84.net/wp-content/uploads/1/cfile1.uf.160435454E1A59C5322140.jpg) 아웃렛 타깃 액션 **
** **
특화된 기능을 어플리케이션에 추가하고 싶다면?
 
**방법 1 : 서브클래스를 구현하는것**
–        단점 1: 특화되는 기능에 따른 서브 클래싱의 수가증가함
–        단점 2: MVC 시스템의 각 영역을 침범하게 됨
–        단점 3: 다른 인터페이스에서 비슷한 기능을 요구할시, 각각의 서브클래스에서 비슷한 코드가 생성되는 
                      중복성이 생김.
 
**방법 2 : 객체 기반의 프레임워크에서 사용하는 사용자인터페이스에 고유한 ID를 부여하는 방식으로            해당 ID에 따른 해당 객체를 매칭시키는 방식**
 
–      단점 1: 객체와 컨트롤러 간의 ID 목록을 동일하게 동기화, 의존성 발생
–      단점 2 : 해당 ID에대한 관리 및 매칭을 위한 비용이 발생
 
****
**코코아의 아웃렛, 타깃,액션 디자인 패턴을 이용하면?**
–      인터페이스 구현 간소화
–      유연성과 유용성 증대
** 패턴이 만들어진동기**
 
–      사용자 인터페이스 객체를 직접 설정 및 조정가능
–      액션 정의 가능
–      특화된 액션과 거리를 두어 의존성이 일어나지 않도록 한다.
–      코드 중복 X
–      컨텍스트 인식 가능
 
 
**패턴으로 문제해결**
 
**아웃렛(Outlet)**
–      사용자 인터페이스 객체에 대한 레퍼런스를 포인터로 저장해 놓은 인스턴스 변수
–      인터페이스 빌더, 런타임시 설정
–      명명법
       : IBOutlet
       : 인스턴스 변수 타입이 id 이고, 첫글자가 _ 이 아닌 경우
  
ex)
Id sampleOutlet ;
IBOutlet *smapleMatrix ;
Id _sambleVar;** //not outlet**
 
 
**타깃(Target)**
–      특별한 아웃렛의 종류중 하나
–      액션 메시지를 처리하는 장소(를 지정)
–      NSControl, NSActionCell,NSMenuItem 클래스에서는 target 아웃렛과 action이라는 인스턴스 변수 제공
 
–      nib 파일 로드시, 아웃렉 연결과 타깃 – 액션간의 연결도 이루어 진다.
–       프로그래밍 상에서 target, setTarget 메서드로설정가능
 
**액션(Action)**
–        void를 반환하며 객체 하나를 인자로 받는 메서드라면 액션 메서드로 가능 
–        프로그래밍 상에서 action, setAction 메서드로설정가능
–        @selector 로 액션메서드가 취급되어 저장됨.
         : objective-c 에서 메시지를 위한 고유 식별자
         : 컴파일러 지시자중 @selector() 사용
 
         [someControl setAction:@selector(copy:)];
 
       : NSSelectorFromString, NSStringFromSelector
 
–      각 클래스 마다 생성되는 이벤트의 경우가 다르다. (touch,slide.. etc)
 
–      액션메시지는 NSApplication 의 –sendAction:to:from: 메서를 사용해서 메시지 전송됨.
 
–      NSApplciation은 싱글톤 패턴의 예)
       [NSApplication sharedApplication];
 
sendAction : @selector 로 보낼 메시지를지정
to : 어디로 보낼것인지. (target)
from : 메시지를 전달하는객체로 메서드로 전달될 객체
 
  
**[* nib 파일이 로딩되는 과정 ](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html "[http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html]로 이동합니다.")**
** **
*** 인터페이스 객체와 아웃렛의 연결**
NSNibOutletConnector 클래스
–      아웃렛과 다른 객체간의 연결관계 정보 저장        nib 파일로 부터 인터페이스 객체 로드
       establishConnection() 실행 : 인터페이스 객체와 연결되어야 하는 아웃렉을 찾아서 기록        아웃렛 접근자 메서드가 있으면, 런타임시, 해당 접근자찾아서 호출
 
287p 예제
 
 
**액션과 리스폰더 체인**
 
**NSApplication 의 역할**
** **
**만약, sendAction:to:from: 에서 to:nil 이라면?**
–      리스폰더 체인을 사용하여, 어느 객체가 처리할수 있는지검색후 전달.
–      현재 컨텍스트에 민감하게 되는셈.
–      리스폰더 체인중 제일 먼저 수신가능한 객체(firstResponder)에게액션 메시지 전달
–      만약, 수신가능한 객체가 없다면 비프음을 냄
 
*** 코코아의 자동메뉴 항목/컨트롤 검증기능**
 
–      송신 객체가 활성화되어 있는지를 체크함.
–      동일한 리스폰더 체인 사용
–      만약 메시지를 처리할수 있는 객체가 없다면, 
        이미객체를 비 활성화 시키고, 액션메시지를 보낼수 없도록 차단한다.
 
–      모든 클래스가 제공하는 action을 자동으로 찾아서인터페이스 빌더에서 사용할 수 있도록 제공 한다.
–      IBAction 전처리 매크로 , void 혀응로 변환됨.
–      파라미터가 꼭 id 형일 필요는 없음.
 
–      (IBAction)volumeSliderDidChange:(NSSilder*) sender
 
** **
**코코아 사용 예제**
**                   **
**아웃렛/타깃/액션과 MVC 패턴**
 
–      오직 View 와 Controller와연결되어 있음.
–      모델 서브 시스템은  연관성이 거의 없음.
 
–     뷰의 특정 인터페이스 객체에 대한 액션을 Controller에서처리하도록 액션 메서드를 지정하고, 해당          Controller의 액션 메서드에서는 완전 독립적인 모델 시스템을 통해서작업을 수행한다.
 
 
**패턴 사용 결과**
 
–      기존의 수동적인 이벤트 핸드럴 기반의 시스템의 대체자 역할
–      고유한 ID로 관리할 경우의 비 효율적인 부분이 없다.
–      유연성이 증가.
–      인터페이스 설계를 그래픽으로 가능
–      인터페이스와  코드 연결을 위한 추가 코드가 필요 없다.
–      서브 클래스를 작성하여 사용하는 경우가 거의 없다. 
        때문에의존성이 줄어들고 유지/관리 해야하는 코드의 분량이 줄어 든다.

#Action  #cocoa design pattern  #dev  #IOS  #iPhone dev  #outlet  #Target  #Xcode  #아웃렛  #아이폰 개발  #액션  #타깃