세미나 들으면서 어플리케이션 생명 주기에 대해 정리해야 할 필요성을 느껴서 이번 기회에 정리해보기로 했다.
이번에 공부한 내용은 크게 App States(앱의 상태), View Life Cycle(뷰의 생명주기)이다.
1. App States(앱의 상태)
iOS 어플리케이션은 Not runnig, Foreground, Background, Suspended의 상태를 가지고 변화한다.
그리고 이러한 상태의 변화는 AppDelegate에 정의되어있는 메소드들을 실행함으로써 구현된다.
1) Not running : 앱이 실행되지 않거나 종료된 상태를 의미
2) Foreground : 앱이 전면에서 실행되고 있는 상태
- Inactive : Foreground로 진입을 했지만 아직 이벤트를 받지 못하는 상태
-> ex. 전화가 왔을 때, 시스템 메시지가 떴을 때(예 - 배터리 부족)
- Active : 일반적인 상태로, 앱이 전면에서 실행되고 있고 이벤트를 받을 수 있는 상태
3) Background : 앱 실행 상태에서 홈 버튼을 눌러 화면이 꺼진 상태
- Suspended 상태가 되기 전 잠깐 머무는 상태
- 코드가 실행중이지만 사용자의 이벤트를 받을 수는 없음, 추가적인 코드(ex. 파일 다운로드)를 실행하는 동안 머무름
4) Suspended : 앱 실행이 중단되어 아무런 코드를 실행하지 않는 상태
- 빠른 재실행을 위해 메모리에 적재된 상태
- 메모리가 부족하면 시스템이 Suspended 상태의 앱을 종료시킴
AppDelegate : Life Cycle을 관리하는 클래스로, 앱 실행 상태 변화를 메소드로 정의해둠
① 앱을 처음 시작할 때, 앱이 화면이 표시 되기 직전에 실행
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
② Active -> InActive 상태로 전이될 때 실행
func applicationWillResignActive(_ application: UIApplication)
③ Background 상태일 때 실행
func applicationDidEnterBackground(_ application: UIApplication)
④ Background -> Foreground로 전이될 때 실행
func applicationWillEnterForeground(_ application: UIApplication)
⑤ Active될 때 실행
func applicationDidBecomeActive(_ application: UIApplication)
⑥ 앱이 종료될 때 실행 (단, suspend 상태에서는 호출되지 않음)
func applicationWillTerminate(_ application: UIApplication)
AppDelegate는 iOS 12 이전과 이후로 나뉜다.
iOS 12 이전에 어플리케이션은 '하나'의 프로세스와 '하나'의 UI만을 가졌다.
그런데 이제 iOS 13에 멀티 윈도우를 지원하게 되면서 '하나'의 프로세스와 '여러 개'의 UI를 가질 수 있게 되었다.
기존의 App Delegate는 Process Life Cycle과 UI LifeCycle 기능을 모두 담당하고 있었다.
- Process LifeCycle : 응용 프로그램에 프로세스 수준의 이벤트를 알리는 것(App Delegate 메소드 중 1, 6번 - 앱의 실행과 종료)
- UI LifeCycle : 응용 프로그램에 UI의 상태를 알리는 것(App Delegate 메소드 중 2~5번)
그런데 이제 iOS 13에서 멀티 윈도우를 지원하게 되면서 SceneDelegate가 새로 생기고, window(화면)의 개념이 scene으로 변경되었다.
SceneDelegate는 기존 App Delegate에 있던 UI LifeCycle의 기능을 이전해 각 Scene에 대해 관리한다.
대신 이제 App Delegate에서는 Scene에 대한 정보를 관리하는 Session LifeCycle이 추가되었다.
2. View Life Cycle(뷰 생명주기)
앱에 생명주기가 있다면, 어플리케이션에 나타나는 뷰 하나에도 생명주기가 별도로 존재한다.
마찬가지로 메소드를 통해 구현이 된다.
override func viewDidLoad() {
super.viewDidLoad()
print("뷰 계층이 메모리에 로드된 직후 호출됨")
// 주로 초기화 작업을 담당
// 뷰가 메모리에 처음 로드될 때 1회만 호출됨
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("뷰 계층 추가 이후 화면에 표시되기 전에 호출")
// viewDidLoad와 달리 다른 뷰에서 이동하면 다시 호출됨
// 화면이 나타날 때마다 수행해야 하는 코드를 작성
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("뷰 계층에 추가된 후 화면에 표시되면 호출")
// 뷰가 나타내는 것과 관련된 코드 작성
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("뷰 계층에서 뷰가 사라지기 직전 호출")
// 뷰 생성 이후 했던 작업을 되돌리는 코드 작성
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("뷰 계층에서 뷰가 사라진 이후 호출")
// 뷰를 숨기는 것과 관련된 코드 작성
}
'iOS' 카테고리의 다른 글
[iOS] IBOutlet Collection이란? (1) | 2021.10.11 |
---|
댓글