App Lifecycle
App 의 생명주기는 다음 과정을 포함한다.
🌀 App 의 실행 · 종료
🌀 App Foreground · Background 상태
🌀 시스템이 발생시키는 event 에 의해 App 상태 전환
iOS App 은 Objective-C 기반이기 때문에
main
함수에서 시작된다.
iOS 의 핵심 라이브러리인 UIKit
framework 가 main 함수를 관리하기 때문에
직접 main
함수에 코드를 작성하지 않는다.
UIKit
은 main
함수를 다루는 과정에서
UIApplicationMain
함수를 실행하고 UIApplication
객체가 생성된다.
UIApplication
객체가 생성되고
@UIApplicationMain
또는 @Main
어노테이션이 있는 클래스를 찾아
AppDelegate
객체를 생성한다.
터치와 같은 유저의 액션을 받는 Main Event Loop
를 실행한다.
Main Run Loop
발생한 이벤트들을 처리하는 프로세스이다.
UIApplication
객체는 앱이 실행될 때 Main Run Loop 을 실행하고
View
와 관련된 이벤트나 View
의 업데이트에 활용한다.
View
와 연관되어 있기 때문에 Main thread
에서 실행된다.
유저가 버튼 터치 등과 같은 이벤트를 만들면
OS 를 통해 이벤트가 생성된다.
생성된 이벤트는 UIKit
프레임워크를 통해 앱으로 전달된다.
이벤트는 앱 내부적으로 Queue
형태로 정리되고
Event Queue
에 쌓이게 된다.
Event Queue
에 쌓여있는 이벤트들은 Main Run Loop
에 하나씩 매핑된다.
가장 먼저 실행되어야하는 이벤트가 무엇인지
UIApplication
객체가 결정한다.
App State
Not Running - 앱이 실행되지 않았거나 완전히 종료되지 않은 상태
Inactive - 앱이 실행되면서 Foreground 에 진입하지만 어떠한 이벤트도 받지 않는 상태
active (Foreground) - 앱이 실행중이며, Foregound 에 있고, 이벤트를 받고 있는 상태
Background - 앱이 Background 에 있으며, 다른 앱으로 전환되었거나 홈버튼을 눌러 밖으로 나갔을 때의 상태
Suspended - 앱이 Background 상태에 있지만 아무 동작을 하지 않는 상태
↳ ❗️ 메모리상에 앱이 올라가 있지만 아무 일도 하지 않기 때문에 배터리를 사용하지 않는다.
↳ ❗️ OS 에 의해 메모리 부족현상이 발생하면 이 상태의 앱은 메모리에서 없어질 수 있으며 따로 알림을 주지 않는다.
App Delegate
application:willFinishLaunchingWithOptions: 어플리케이션이 최초 실행될 때 호출되는 메소드
application:didFinishLaunchingWithOptions: 어플리케이션이 실행된 직후 사용자의 화면에 보여지기 직전에 호출
applicationDidBecomeActive: 어플리케이션이 Active 상태로 전환된 직후 호출
applicationWillResignActive: 어플리케이션이 Inactive 상태로 전환되기 직전에 호출
applicationDidEnterBackground: 어플리케이션이 백그라운드 상태로 전환된 직후 호출
applicationWillEnterForeground: 어플리케이션이 Active 상태가 되기 직전에, 화면에 보여지기 직전의 시점에 호출.
applicationWillTerminate: 어플리케이션이 종료되기 직전에 호출
📚 Reference
Responding to the Launch of Your App
Managing Your App's Life Cycle
Know the Core Objects of Your App
[iOS] 앱의 생명주기(LifeCycle) AppDelegate
Main event loop
[iOS] 앱의 생명주기(App Life Cycle)와 앱의 구조(App Structure)
[iOS] App의 생명주기 (Life Cycle)