Introduce

  • iOS는 각각의 app에 대해 실행부터 종료까지의 일련의 생명 주기를 관리합니다

Reference

  1. 앱의 생명주기와 앱의 구조
  2. The App Life Cycle
  3. iOS App Life Cycle

Life Cycle of Apps

  • App의 life cycle은 app을 터치해서 실행시키고 완전히 종료되기까지 다음 10단계로 요약해 볼 수 있습니다.
    1. App touch
    2. App entry point main() 호출
    3. main() 안에서 iOS entry point UIApplicationMain() 호출, UIApplication 객체 생성
    4. UIApplication 객체는 info.plist 파일을 바탕으로 앱에 필요한 데이터와 객체를 로드
    5. 커스텀 코드 처리를 위한 AppDelegate 객체 생성, UIApplication 객체와 연결
    6. 주요 객체 생성, 이벤트 루프 생성 등 실행 준비. 끝나기 직전에 application(_:willFinishLaunchingWithOptions:) 호출
    7. 준비가 끝나고 앱이 실행되기 직전에 application(_:didFinishLaunchingWithOptions:) 호출
    8. Main run loop 실행. 사용자로부터 받은 event를 event queue를 통해 순서대로 처리. 이벤트 핸들(@IBOutlet, @IBAction 등)에 의해 커스텀 코드와 연결되어 실행시킴
    9. App을 더 이상 사용하지 않으면 iOS system에 terminate 메시지 전달, applicationWillTerminate(_:) 호출.
    10. App 종료

image.png

  • C 계열의 언어인 Objective-C를 사용할 때는 entry point main()을 가지기 때문에, main() 안에서 iOS의 entry point인 UIApplicationMain()을 호출하도록 하여 UIApplication 객체를 생성하고 있습니다.
  • 이후 등장한 Swift 언어는 C 계열의 언어가 아니기 때문에 main()과 같은 entry point를 갖지 않습니다.
  • Swift에서는 @UIApplicationMain annotation을 통해 UIApplication 객체 생성 과정을 대신합니다.
  • @UIApplicationMain annotation이 붙은 클래스는 UIApplication의 delegate class로 전달됩니다.

UIApplication

  • UIApplication 객체는 event loop을 관리합니다.
  • AppDelegate에 app 상태변화, 푸시 알림 등 주요 event를 전달하여 custom code를 처리하도록 합니다.

AppDelegate

  • AppDelegate는 UIApplication 객체로부터 app life cycle 동안 custom code를 처리하는 기능을 위임받은 클래스입니다.
  • UIApplication을 상속받아서 UIApplication의 권한 일부를 부여받아 app 초기화, 상태변화, event 등을 관리합니다.
  • AppDelegate는 app당 하나의 인스턴스를 갖도록 보장됩니다.
  • UIApplicationDelegate protocol을 구현하여 app의 상태 변화마다 호출되는 method에 custom code를 작성하여 실행시킬 수 있습니다.

Execution States of Apps

  • App은 사용 중에 홈 버튼을 누르거나, 전화가 오는 등 system에서 발생하는 동작에 의해 5가지 상태를 가질 수 있습니다.
  • Not Running
    • App이 아직 실행되지 않았거나 완전히 종료된 상태입니다.
  • Inactive(Foreground)
    • App이 foreground 상태에 있지만 이벤트를 받지 않습니다.
    • Active 상태로 넘어가기 전에 잠시동안 이 상태에 있게 됩니다.
  • Active(Foreground)
    • App이 foreground 상태에 있고 이벤트를 받습니다.
    • Foreground 상태에 있는 app들은 평소 이 상태에 머물러 있습니다.
  • Background
    • App이 background 상태에서 다른 코드를 실행합니다.
    • Background 상태로 실행되는 app은 inactive 대신 background 상태로 진입합니다.
    • Suspended 상태로 넘어가기 전에 잠깐 머무르는 상태입니다.
    • Suspended 상태로 진입하기 전에 추가적인 코드 수행이 필요하면 좀 더 머무를 수도 있습니다.
  • Suspended
    • App이 background 상태에서 메모리에만 올라가 있고 코드를 실행하지 않습니다.
    • Background에서 추가적인 작업이 없다면 자동으로 suspended 상태로 진입합니다.
    • 다른 app을 실행하면서 메모리가 부족해지면 iOS system은 suspended 상태에 있는 app들을 별도의 알림 없이 종료시켜서 메모리를 확보합니다.

image.png

Delegate Call

  • App이 상태 변화가 일어나면 AppDelegate에 구현된 UIApplicationDelegate method들이 호출됩니다.
  • App의 상태 변화에 따라 의도한 custom code를 실행시킬 수 있습니다.
  • application(_:willFinishLaunchingWithOptions:)
    • App 실행을 위한 초기화가 완료되기 직전에 호출됩니다.
    • 주로 App 실행 시 최초로 실행할 코드를 작성합니다.
  • application(_:didFinishLaunchingWithOptions:)
    • App이 실행되고 화면이 사용자에게 보여지기 직전에 호출됩니다.
    • 주로 App 실행 후에 최종 초기화 코드를 작성합니다.
    • Not Running -> Foreground
  • applicationDidBecomeActive(_:)
    • App이 Not Running 상태에서 Foreground(Inactive, Active) 상태로 진입할 때 호출됩니다.
    • 주로 App이 실제로 사용되기 전에 마지막으로 준비할 수 있는 코드를 작성합니다.
  • applicationWillResignActive(_:)
    • App이 Foreground(Active) 상태에서 다른 상태로 진입할 때 호출됩니다.
    • 주로 App이 quiescent(조용한) 상태로 변환될 때의 작업을 진행합니다.
  • applicationDidEnterBackground(_:)
    • App이 Background 상태에 진입했을 때 호출됩니다.
    • 특별한 처리가 없으면 Background 상태에서 Suspended 상태로 전환됩니다.
    • App이 Suspended 상태로 진입하기 전에 중요한 데이터를 저장하거나 점유하고 있는 공유 자원을 해제하는 등 종료되기 전에 준비 작업을 진행합니다.
    • App이 종료된 이후 다시 실행될 때 직전 상태를 복구할 수 있는 정보를 저장합니다.
  • applicationWillEnterForeground(_:)
    • App이 Background에서 Foreground로 돌아오기 직전 호출됩니다.
    • Method가 호출된 뒤 Inactive 상태를 거쳐 Active 상태로 진입합니다.
  • applicationWillTerminate(_:)
    • App이 종료되기 직전에 호출됩니다. App이 곧 종료될 것임을 알려줍니다.
    • 다음 경우에는 호출되지 않습니다.
      1. 메모리 확보를 위해 Suspended 상태에 있는 app을 종료시킬 때
      2. 사용자가 multitasking UI를 통해 종료할 때
      3. 오류로 인해 app이 종료될 때
      4. Deivce를 재부팅할 때

Summary

App Execution State

image.png

App Life Cycle

image.png