AppDelegate 란 무엇이며 언제 사용해야하는지 어떻게 알 수 있습니까?


146

저는 iPhone 앱에서 일하기 시작했습니다. AppDelegate와 사용자 정의 클래스에 물건을 넣을시기를 어떻게 알 수 있습니까? AppDelegate와 같은 패턴을 사용하는 Python 또는 PHP와 같은 다른 프로그래밍 언어와의 규칙 또는 모든 유형의 유추가 있습니까?

답변:


255

나는 Andrew가 "응용 프로그램의 핵심"이라는 용어를 사용함으로써 암시 된 설계 방식을 피합니다. 이것이 의미하는 바는 중앙 위치에 너무 많은 것들이 집중되는 것을 피해야한다고 생각합니다. 좋은 프로그램 디자인은 일반적으로 "관심 영역"으로 기능을 분리하는 것입니다.

델리게이트 개체는 연결된 개체가 특정 이벤트 나 상태에 도달 할 때 알림을받는 개체입니다. 이 경우 Application Delegate는 UIApplication 객체가 특정 상태에 도달하면 알림을받는 객체입니다. 많은면에서, 이것은 일대일 관찰자 패턴입니다.

이는 AppDelegate의 "관심 영역"이 특수한 UIApplication 상태를 처리하고 있음을 의미합니다. 이것들 중 가장 중요한 것은 :

  • applicationDidFinishLaunching :-시작시 구성 및 구성 처리에 적합
  • applicationWillTerminate :-마지막에 정리하기에 좋습니다

다른 기능은 AppDelegate에 포함되지 않으므로 AppDelegate에 두지 마십시오. 이러한 다른 기능은 다음과 같습니다.

  • 문서 데이터-문서 관리자 싱글 톤 (여러 문서 애플리케이션의 경우) 또는 문서 싱글 톤 (단일 문서 애플리케이션의 경우)이 있어야합니다.
  • 버튼 / 테이블 / 뷰 컨트롤러, 뷰 델리게이트 메소드 또는 기타 뷰 처리 (applicationDidFinishLaunching :에서 최상위 뷰 구성 제외)-이 작업은 각 뷰 컨트롤러 클래스에 있어야합니다.

많은 사람들이 게 으르거나 AppDelegate가 전체 프로그램을 제어한다고 생각하기 때문에 이러한 것들을 AppDelegate에 집중시킵니다. AppDelegate는 앱의 관심 영역을 흐리게하고 확장 할 수 없으므로 AppDelegate에서 중앙 집중화를 피해야합니다.


8
+1 이것은 훌륭한 답변입니다. 하위 뷰가 appDelegate에 호출하여 뷰 컨트롤러가 다른 하위 뷰로 전환하도록 지시하는 코드 샘플을보고 있었고 코드 냄새처럼 느껴졌습니다. 코가 여전히 작동한다는 것을 알고 반갑습니다.
Alan

2
때때로 우리는 온라인 자습서에서 이와 같은 것을 보게됩니다 : AppDelegate * del = [AppDelegate sharedAppDelegate]; ( developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 참조 ) 이것이 무엇을 의미합니까? 나는 그것을 사용하는 예제를 볼 수 있지만 실제로 그 뒤에있는 이론을 이해하지 못한다 (이 예제를 참조하십시오 : developer.apple.com/library/ios/#samplecode/… )
abbood

27

응용 프로그램 위임은 응용 프로그램의 핵심입니다. 효과적으로 "프로그램 컨트롤러"입니다.

Application Delegate는 다른 뷰 생성을 시작하는 데 가장 일반적으로 사용되는 applicationDidFinishLaunching 메시지를 포함하여 응용 프로그램 수준 메시지를받는 클래스입니다.

정확히 비슷하지는 않지만 Cocoa 프로그램의 "main ()"루틴으로 생각할 수 있습니다.


AppDelegate에 모든 UI 컨트롤러를 배치하는 것이 모든 사용자 정의 클래스를 만드는 것보다 번거롭지 않기 때문에 +1을 제공합니다.
rwols

3
@rwols는 조심스럽게 문제를 분리하여 코드를 정리하는 데 도움이되며 디버그하기가 쉽지 않으므로 이러한 사용자 정의 클래스를 만드는 데 시간이 걸리고 모든 관찰자를 단일 파일에 넣지 마십시오.
wheeliez

2

@Shivam, 감사합니다.

내가 이해 appDelegate하는 것에서 ApplicationAndroid의 내용과 가깝습니다 . 는 viewDidLoad, viewDidDisappear안드로이드의 라이프 사이클 것과 비교입니다. 모든 응용 프로그램에는 시작부터 전화 통화 중단, 알림 표시까지 수명주기가 있습니다. 이 때 특별한 일을하기 위해 코드가 필요한 경우system 이벤트가 발생할 메소드 코드를 작성해야합니다.

우리가 사용하는 안드로이드에서 onPause, onDestroy, onCreate좀 같은 시스템 이벤트를 처리하는 방법을 콜백.


onPause, onCreate그리고 onDestroy안드로이드의 방법은 더 유사하다 viewDidDisappear, viewDidLoad아이폰 OS 뷰 컨트롤러의 수명주기의 방법. 비교해야한다면 ApplicationAndroid 클래스 AppDelegate가 iOS 클래스에 더 가깝습니다 .
Shivam Bhalla

고마워, 내 대답을 더 좋게 할 수 있다면하십시오. 귀하의 답변을 읽은 후 답변을 삭제하겠습니다.
Siddharth

1

이것이 조금 더 도움이되기를 바랍니다 ...

이 언어를 처음 사용하는 프로그래머는 항상 같은 질문을합니다. 프로그램은 기본 방법에서 시작합니까? 예,이 경우에 옳습니다. iOS 앱도 주요 방법에서 시작합니다.
메인 클래스는 아래 함수를 호출합니다.

 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

UIApplicationMain은 UIApplication객체 를 생성하는 Cocoa Touch 실행 루프 및 앱 인프라를 시작 합니다. 우리의 응용 프로그램은 objective-c가 이것을 처리하기 위해 델리게이트를 사용하므로 내용이 필요합니다. 그렇기 때문에 AppDelegate (의 대리인 역할 UIApplication)라고합니다. 해당 대리자의 선택적 옵션 중 일부를 구현하며 그에 따라 동작합니다.


누군가가 위의 답변에서 잘못 잘못 이해하도록 만들 수
있습니까?

2
a) 적절한 구두점 / 맞춤법 / 문법을 사용하지 않고 b) 원래 포스터가 요청한 질문에 실제로 답변하지 않으므로 주제가 맞지 않기 때문에 혼란스러워 보입니다.
Kay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.