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.