8월, 2021의 게시물 표시

AppDelegate.swift 알아보기

 기본 개념 (1). AppDelegate 클래스를 정의합니다. 참고로 app delegate는 AppDelegate 클래스의 인스턴스입니다. app delegate는 앱의 객체로서, 앱의 상태에 따라 응답하는 콘텐츠가 그려지는 window를 생성합니다. 즉, AppDelegate.swift가 AppDelegate 클래스를 만들고 AppDelegate 클래스가 인스턴스를 생성합니다. 생성된 인스턴스인 app delegate는 앱 내용이 그려질 window를 생성합니다. (2). entry point와, 앱의 입력 이벤트를 전달하는 run loop를 생성합니다. 이 작업은 @main 속성에 의해 수행됩니다. 앞선 UIApplication에서 설명한 바와 같이, @main은 UIApplicationMain 메서드를 호출합니다. 즉, AppDelegate 클래스의 이름을 delegate 클래스에 전달합니다. 이에 대한 응답으로 시스템은 application 객체를 생성합니다. application 객체는 app의 Life Cycle을 관리 담당합니다. 이어서 시스템은 AppDelegate 클래스의 인스턴스를 생성하고 이를 application 객체에 할당합니다. 마지막으로 시스템은 앱을 실행합니다. 조금 더 알아보기 AppDelegate 클래스는 UIApplicationDelegate 프로토콜을 채택합니다. 이 프로토콜은 앱을 세팅하고, 앱의 상태변화에 응답합니다. 또한, 다른 app-level 이벤트를 처리하기 위한 여러가지 방법을 정의합니다.

UIApplication 알아보기

 기본 개념 UIApplication은 UIResponder와 마찬가지로 class입니다. iOS에서 실행되는 앱을 제어 및 조정하는 중앙 지점입니다. 모든 iOS 앱에는 UIApplication 인스턴스가 하나만 존재합니다. 앱이 실행되면 @main 속성은 UIApplication 싱글톤 객체를 생성합니다. 즉, 앱을 실행하면 @main 속성은 shared app instance를 만든다고 보시면됩니다. UIApplicationMain(_:_:_:_:) @main 속성은 UIApplicationMain(_:_:_:_:) 메서드를 호출합니다. UIApplicationMain(_:_:_:_:) 메서드는 application 객체와 application delegate를 생성합니다. application 객체는 사용자 이벤트의 초기 라우팅을 처리합니다. UIApplication 클래스는 UIApplicationDelegate 프로토콜을 준수합니다. application 객체는 delegate에게 중요한 런타임 이벤트를 알리고 이에 응답할 기회를 제공합니다. App Delegate 대부분 앱은 UIApplication을 서브클래싱할 필요가 없습니다. 대신 app delegate를 활용하여 시스템과 앱 사이의 상호작용을 관리할 수 있습니다. 앱에 들어오는 이벤트를 시스템이 처리하기 전에 처리해야하는 경우에는 UIApplication을 서브클래싱합니다. 그리고 sendEvent(_:) 또는 sendAction(_:to:from:for:) 메서드를 override합니다. 필요한 이벤트를 처리한 후, [super sendEvent: event]를 호출하여 시스템에 이벤트를 다시 전달합니다. 애플에선 이러한 이벤트 인터셉트를 권장하지 않습니다. 앱의 실행 @main 속성을 통해  UIApplicationMain(_:_:_:_:) 메서드를 호출합니다. UIApplicationMain(_:_:_:_:) 메서드의 마지막 파라미터에는 delegateClassName이 전달됩니다.

UIResponder 알아보기

기본 개념 리스폰더 객체(UIResponder의 인스턴스)는 UIKit 앱 이벤트 처리의 백본을 구성합니다. UIApplication, UIViewController, UIView와 같은 객체들은 리스폰더에 포함됩니다. 이벤트가 발생하면 UIKit은 앱의 리스폰더 객체에게 이벤트를 전달합니다. 결국 UIApplication, UIViewController, UIView 객체는 이벤트를 처리할 수 있다는 것을 의미합니다. 백본을 구성한다는 것은 UIResponder가 리스폰더 객체들을 묶어서 하나의 역할을 한다고 이해하시면 됩니다. 이벤트의 처리 터치, 모션, 프레스, 원격제어 등의 다양한 이벤트를 모두 포함합니다. 각 이벤트를 처리하기 위해서 리스폰더는 해당 메소드를 override해야 합니다. e.g.) touchesBegan(_ :with:), touchesCancelled(_ :with:) 등 처리되지 않은 이벤트 UIKit 리스폰더는 처리되지 않은 이벤트를 앱의 다른 부분으로 전달하는 작업도 관리합니다. 리스폰더가 이벤트를 처리하지 않으면 리스폰더 체인의 다음 객체로 해당 이벤트를 전달합니다. UIKit은 어떤 리스폰더 객체가 이벤트를 처리할지 리스폰더 체인을 동적으로 관리합니다. Responder Chain 리스폰더 객체는 이벤트를 전달받으면 이벤트를 처리를 시도합니다. 처리할 수 없는 경우 && 최상위 리스폰더 객체가 아닌 경우 상위 리스폰더 객체로 이벤트를 전달합니다. window객체 까지 이벤트가 전달됐는데 처리할 수 없을 경우엔 singleton app object로 전달됩니다. application 객체가 처리할 수 없을 경우엔 해당 이벤트는 삭제됩니다. 리스폰더 체인을 관리하는 메소드는 다음과 같습니다. e.g.) var next: UIResponder?, var isFirstResponder: Bool, func becomFirstResponder() 등