UIApplication을 이해하고자 문서를 번역, 정리한 내용입니다.(출처)
iOS 앱을 구동하기 위한 조정과 중앙 집중식 제어를 담당하는 곳
@interface UIApplication : UIResponder
모든 iOS 앱에는 딱 하나의(exactly one instance) UIApplication 인스턴스가 존재한다.(혹은 아주 드물게 UIApplication의 서브클래스가 있다) 앱이 시작될 때, 시스템은 UIApplicationMain(_:_:_:_:)
메소드를 호출한다. 이 함수는 싱글톤 UIApplication 객체를 생성한다.
그 후에 sharedApplication
클래스 메소드를 호출해 그 객체(UIApplication 객체?)에 접근할 수 있다.
앱 애플리케이션 객체의 중요한 역할은 사용자 이벤트 초기 라우팅을 처리하는 것이다. 제어 오브젝트(UIControl 클래스의 인스턴스)가 적절한 타겟 오브젝트로 전달한 액션 메시지를 전달한다.
애플리케이션 객체는 열린 창 목록(UIWindow의 객체)을 유지하고 이를 통해 앱의 UIView 객체를 회수할 수 있다.
UIApplication 클래스는UIApplicationDelegate
프로토콜을 따르는 델리게이트를 정의하고 몇 프로토콜의 메소드를 구현한다. 이 어플리케이션 객체는 중요한 런타임 이벤트(예를들어 앱이 시작됐다거나, 메모리 부족 경고, 앱 종료)를 델리게이트에 알려 적절하게 대응할 수 있는 기회를 제공한다
이 클래스의 API를 따르면 디바이스의 구체적인 행동을 관리할 수 있다.
대부분의 앱은 UIApplication을 서브클래싱 할 필요가 없다. 대신 앱 델리게이트를 통해 시스템과 앱 사이의 상호작용을 관리하면 된다.
만약 아주 드문 경우에서 앱이 시스템보다 먼저 들어오는 이벤트를 다뤄야 한다면, 커스텀 이벤트를 구현하거나 작업 전달 메커니즘을 구현할 수 있다.
이렇게 하려면 UIApplication
과 sendEvent:
, sendAction:to:from:forEvent:
메소드를 오버라이드 해야한다.
그리고 가로채는 모든 이벤트에 대해 처리한 후, 다시 시스템에 전달해야 한다.
이벤트를 가로채는 건 거의 필요하지 않고 가능한한 피해야 한다.
앱 시작시 시스템이 UIApplicationMain
메소드 호출
-> 호출되는 함수가 UIApplication
인스턴스를 만드는데, 얘는 앱에 딱 하나만 존재
-> 사용자의 터치 등이 시스템에 의해 이벤트로 생성되는데, 이 이벤트를 UIApplication
이 받아서 UIControl
객체에 전달
-> UIControl
객체에 의해 이벤트 메시지(액션 메시지)가 적절한 대상에게 전달됨
그리고 UIApplication
은 UIApplicationDelegate
프로토콜을 채택해 중요한 런타임 이벤트(앱 시작,종료,메모리 부족 등)를 델리게이트가 처리하게 함.
UIApplication의 인스턴스 프로퍼티인 delegate에 대해 알아보자.
app object의 대리자이다.
unowned(unsafe) var delegate: UIApplicationDelegate? { get set }
모든 앱은 앱과 관련된 메시지에 응답하기 위해 app delegate 객체를 가져야 한다. 예를 들어, 앱은 앱 시작이 완료되고 foreground or background 상태가 변경될 때 델리게이트에게 알린다. 마찬가지로 시스템에서 오는 앱 관련 메시지는 종종 처리를 위해 app delegate에게 라우팅된다.
Xcode는 모든 앱에 초기 app delegate를 제공하므로 나중에 이 델리게이트를 변경할 필요가 없다.
델리게이트는 반드시 UIApplicationDelegate
프로토콜을 채택해야 한다.
UIApplication.delegate 객체가 AppDelegate의 인스턴스라고? 둘이 무슨 관계인지는 낼부터......