study record
iOS App 실행 과정 본문
앱 사용시 발생하는 다양한 상황에 적절하게 대응해야 하기때문에 앱 생명주기를 이해하는 것은 중요하다.
앱 실행
- main 함수 실행
- main 함수가 UIApplicationMain 함수 호출 (App 실행 관리의 중점)
- UIApplicationMain 함수는 앱의 본체에 해당하는 객체인 UIApplication 객체 생성
- 싱글톤 객체로 Event Loop에서 발생하는 여러 이벤트들을 감지하고, Delegate에 전달하는 역할을 한다. 예시로 앱이 백그라운드로 갈 때, 메모리 부족 경고를 할 때 등의 상황들을 감지하여 Delegate에 전달한다.
- @UIApplicationMain 어노테이션이 있는 클래스를 찾아 AppDelegate 객체, SceneDelegate 객체 생성
- Scene은 디바이스에서 실행되고 있는 앱의 UI 인스턴스를 나타낸다. 사용자 스크린에 UI를 나타내기 위한 window, view, viewcontroller들을 관리하기 위해 scene 객체를 사용한다는 것이다. UI 인스턴스 생성은 제공받은 정보에 의존하는데, 이러한 정보를 가지고 있는 것이 Info.plist이다. 런타임 시간동안에 dynamic하게 관리 될 수도 있다.
- nib 파일을 사용하거나, Info.plist 파일을 읽어들여 파일에 기록된 정보를 참고하여 그 외에 필요한 데이터 로드, 메인스토리보드 로드
- Main Event Loop(유저의 액션을 받는 Loop, Run Loop)를 실행 및 기타 설정
- 실행 완료를 앞두고 앱 객체가 AppDelegate에게 application:didFinishLaunchingWithOptions 메시지를 보낸다.
- window객체 생성 (초기 ViewController의 인스턴스를 window의 RootViewController로 할당)
- ViewController의 View가 로드된다.
- 만약 storyboard나 xib로 부터 view를 생성했다면 이 객체는 초기화되고 초기 인터페이스의 객체가 된다. 이제 뷰는 윈도우에 올라가게 되고, 이것의 subview가 사용자에게 보여지게 된다. 이제 view controller의 **viewDidLoad가 호출** 될 수 있고, 앱이 실행될 준비가 갖춰진다.
*swift 5.3부터 프로그램의 entry point를 알려주는 속성이 @UIApplicationMain에서 @main으로 변경되었다.
Main Run Loop
Main Run Loop는 사용자 관련 이벤트들을 받은 순서대로 처리한다. UIApplication 객체는 앱이 실행될 때, Main Run Loop를 실행하고, 이 Run Loop로 이벤트를 처리한다. 앱의 메인 스레드에서 동작한다.
사용자가 디바이스에서 특정 액션을 취하면 그 액션에 해당하는 이벤트가 시스템에 의해 생성되어 UIKit에서 생성한 포트를 통해 앱에 전달된다. 전달된 이벤트들은 큐에 보관되고 하나씩 Main Run Loop에 전달되어 처리된다.
AppDelegate, SceneDelegate
AppDelegate 객체는 UIApplication 객체로부터 메시지를 받았을 때, 해당 상황에서 실행될 함수들을 정의한다.
SceneDelegate는 앱의 상태에 따라 응답하는 콘텐츠가 그려지는 창(window)를 만든다.
window 프로퍼티
이 프로퍼티는 앱의 창에 대한 참조를 저장한다. 이 window는 앱의 view 계층 구조의 루트를 나타낸다. 앱 콘텐츠가 모두 그려지는 곳이다. window 프로퍼티는 옵셔널 프로퍼티이다.
sceneDelegate의 메서드들을 사용하면 응용프로그램 객체가 AppDelegate와의 통신이 가능하다. 앱상태가 전환되는 동안(background, foreground) 응용프로그램 객체는 위 메서드들 중 해당하는 delegate메서드를 호출하여 앱이 응답할 수 있는 기회를 제공한다. 자동으로 반드시 수행되므로 따로 호출에 대한 작업을 할 필요는 없고, 응용프로그램 객체가 해당 작업을 알아서 처리한다.
SceneDelegate 메서드
scene(_: willConnectTo: options: )
UISceneSession life cycle에서 가장 먼저 불리는 메소드로 새로운 UIWindow를 생성하고 window의 rootViewController를 설정한다. 이 때의 window는 사용자가 보는 것이 아니라 앱이 작동하는 viewport이다. 첫 view를 만드는데 쓰이기도 하지만 과거에 disconnected된 UI를 되돌릴 때도 쓰기도 한다.
sceneWillEnterForeground(_ :)
scene이 세팅되고 화면에 보여지면서 사용될 준비가 완료된 상태이다. inactive -> active 전환 시에 불려진다.
sceneWillResignActive(_:)
active한 상태에서 inactive 상태로 빠질 때 불린다. 사용 중 전화가 오는 것처럼 임시적인 상황 때문에 발생할 수 있다.
sceneDidEnterBackground(_:)
scene이 포그라운드에서 백그라운드로 전환될 때 불리게 된다. 다음에 다시 포그라운드에 돌아올 때 복원할 수 있도록 상태 정보를 저장하거나, 데이터를 저장, 공유 자원 돌려주는 등의 일을 하도록 하면 된다.
sceneDidDisconnect(_:)
scene이 백그라운드로 들어갔을 때 시스템이 자원을 확보하기 위해 disconnect(scene이 이 메서드로 전해지면 session에서 끊어진다.)할 수도 있다. 이 메소드에서 가장 중요한 작업은 필요없는 자원을 돌려주는 것이다. 디스크나 네트워크를 통해 쉽게 불러올 수 있거나 생성이 쉬운 데이터들은 돌려주고, 사용자의 input과 같이 재생성이 어려운 데이터는 가지고 있게끔 하는 작업을 해준다.
iOS12 이전 AppDelegate 메서드
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
func applicationWillResignActive(_ application: UIApplication)
func applicationDidEnterBackground(_ application: UIApplication)
func applicationWillEnterForeground(_ application: UIApplication)
func applicationDidBecomeActive(_ application: UIApplication)
func applicationWillTerminate(_ application: UIApplication)
참고:
https://jinshine.github.io/2018/05/28/iOS/앱의 생명주기(App Life Cycle)와 앱의 구조(App Structure)/
https://you9010.tistory.com/321
https://velog.io/@ellyheetov/ios-entrypoint
https://github.com/YoungjunGu/Youngjun-iOS-Studio/blob/master/iOS-AppLifeCycle/LifeCycle.md
'iOS > iOS 정리' 카테고리의 다른 글
[iOS] UIResponder (0) | 2022.03.30 |
---|---|
[iOS] NSCache란? (0) | 2022.03.26 |
[iOS] View의 생명주기 (0) | 2022.03.23 |
dequeueReusableCell(withIdentifier:for:) 의미와 장점 (0) | 2022.03.17 |
[iOS] NotificationCenter (0) | 2022.03.16 |