-
Life Cycleios/Etc 2022. 2. 23. 00:09728x90
Life Cycle 생명주기
- 생명주기란 앱의 실행부터 종료까지의 주기를 말하며 시스템 알림에 응답하는 등 여러 시스템 관련 이벤트를 처리하는 단계들이다.
- 앱과 관련된 생명주기는 AppDelegate에서 처리하고, Scene과 연관된 생명주기는 SceneDelegate에서 처리한다.
- iOS 13 이전 버전에서는 App-Based Life-Cycle을 가지고 13 이후 부터는 Scene-Based Life-Cycle을 가진다.
iOS 13 이전의 App-Based Life-Cycle
willFinishLaunchingWithOptions
델리게이트에게 실행 프로세스가 거의 완료되었으며 앱 실행 준비가 거의 완료되었음을 알린다.
(https://leehonghwa.github.io/blog/applicationDidFinishLaunchingWithOptions/)
didFinishLaunchingWithOptions
델리게이트에게 실행 프로세스가 거의 완료되었으며 앱을 실행할 준비가 거의 완료되었음을 알린다.
(https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622921-application)
Lifecycle 이벤트 반응 applicationDidBecomeActive
델리게이트에게 앱이 실행될 것이라는 것을 알린다.
applicationWillResignActive
델리게이트에게 앱이 방금 inactive 상태가 되려는 것을 알린다.
applicationDidEnterBackground
델리게이트에게 앱이 지금 백그라운드 상태라는 것을 알린다.
applicationWillEnterForeground
델리게이트에게 앱이 foreground 상태에 진입하려는 것을 알린다.
applicationWillTerminate
델리게이트에게 앱이 종료되려는 것을 알린다.
iOS 13 이후의 Scene-Based Life-Cycle
AppDelegate
AppDelegate (AppDelegate는 scene 구성 및 삭제를 담당한다. )
configurationForConnecting
새 장면을 만들 때 사용할 UIKit의 구성 데이터를 반환한다.
(https://developer.apple.com/documentation/uikit/uiapplicationdelegate/3197905-application)
didDiscardSceneSessions
사용자가 app switcher를 통해 scene을 닫을 때 호출된다.
(https://developer.apple.com/documentation/uikit/uiapplicationdelegate/3197906-application)
SceneDelegate
SceneDelegate (SceneDelegate는 life cycle 이벤트 및 상태 복원을 scene 별로 관리한다.)
- iOS12 까지는 하나의 앱에 하나의 window를 부여했으나 iOS 13부터는 window의 개념이 scene으로 대체되고 하나의 앱에서 여러 개의 scene을 가질 수 있게 됨.
- iOS13부터 scene기반 앱에서 life-cycle events에 반응하기 위해 UISceneDelegate를 사용.(13 이전에는 UIApplicationDelegate를 사용함)
- scene을 지원하는 앱의 경우 UIKit가 life-cycle 이벤트를 전달한다. scene은 기기에서 실행되고 있는 앱 UI의 한 인스턴스를 나타낸다. 사용자는 각 앱에 여러 scene들을 만들 수 있고, 각 앱들을 보이거나 숨기게 할 수 있다. 그 이유는 각 scene은 각자의 life cycle을 가지고 있고, 각자 다른 실행상태를 가질 수 있기 때문이다. 예를 들어 어떤 scene이 foreground에 있으면 다른 scene들은 background에 있거나, suspended된 상태가 될 수 있다.
. 유저나 시스템이 app에 새로운 scene을 요청하면, UIKit가 앱에 scene을 연결시킬때, scene의 초기 UI를 구성하고, scene이 필요한 data를 로드한다.
(처음에는 Unattached 상태)
-사용자 요청 scene은 빠르게 foreground로, 시스템 요청 scene은 일반적으로 background로 이동해서 이벤트를 진행한다.
. foreground-active 상태로 바뀌면, UI를 구성하고 사용자와 상호작용할 준비를 한다.
(forecround-Inactive를 거치고 난 뒤에 Active로 바뀜)
. foreground-active 상태를 벗어날 때, 데이터를 저장하고 앱의 동작을 멈춘다.
. 사용자가 앱UI를 닫으면, UIKit는 연관된 scene을 background 혹은 suspended 상태로 들어간다. 중요한 작업들을 끝내고, 가능한 최소의 메모리만 남기고 스냅샷을 준비한다.
(snapshot 이란? https://www.inflearn.com/questions/268685)
. UIKit는 background scene이나 suspended scene을 자원 회수를 위해 연결 해제할 수 있고 unattached 상태로 되돌릴 수 있다.
. 앱 연결이 종료되면 scene과 연관된 공유 자원들을 청소한다.
- Foreground :
1. Inactive: 앱이 실행 중인 상태이나 이벤트를 받지는 않음. Active 상태로 넘어가기 전에 앱이 반드시 거치는 상태, 알림 같은 특정 알림파이 화면을 덮어서 앱이 event를 받지 못하는 상태
2. Active: 앱이 실행 중이고 이벤트를 받을 수 있는 상태. Foreground 앱의 일반적인 상태
- Background
앱 사용 중에 다른 앱을 실행하거나 홈 화면으로 나갔을 때 상태. 백그라운드에서 동작하는 코드를 추가하면 suspended 상태로 넘어가지 않고 백그라운드 상태를 유지. 처음부터 background 상태로 실행되는 앱은 inactive 대신 background 상태로 진입. 음악을 실행하고 홈 화면으로 나가도 음악이 나오는 상태
- Suspend
앱이 background 상태에서 추가적인 작업을 하지 않으면 곧바로 suspended 상태로 진입. 앱을 다시 실행할 경우 빠른 실행을 위해 메모리에는 올라가 있음. 메모리가 부족한 상황이 되면 iOS는 suspended 상태에 있는 앱들을 메모리에서 해제
View Life Cycle
View Life Cycle - 앱은 하나 이상의 뷰로 구성이 되어 있으며, 각각의 뷰들은 라이프 사이클을 가지고 있어서 뷰의 라이프 사이클을 고려해서 로직을 구성해야 함
- ViewDidLoad: 뷰의 로딩이 완료 되었을 때 시스템에 의해 자동으로 호출되기 때문에 일반적으로 리소스를 초기화하거나 초기 화면을 구성하는 용도로 주로 사용. 화면이 처음 만들어질 때 한 번만 실행되므로, 처음 한 번만 실행해야 하는 초기화 코드 작성
- ViewWillAppear: 뷰가 나타나기 직전에 항상 실행이 되기 때문에 다른 뷰로 갔다가 돌아올 때 하고 싶은 작업을 여기서 함
- ViewDidAppear: 뷰가 나타난 뒤에 실행. 데이터를 받아서 화면에 뿌려주거나 애니메이션 등의 작업
- ViewWillDisappear: 뷰가 사라지기 직전에 실행
- ViewDidDisappear: 뷰가 사라지고 난 뒤에 실행
참고
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
Scene-Based Life-Cycle(SceneDelegate.swift, AppDelegate.swift)
https://developer.apple.com/documenta...
https://developer.apple.com/videos/pl...
View Life Cycle
728x90'ios > Etc' 카테고리의 다른 글
@escaping (0) 2022.05.14 Concurrency & Threading (0) 2022.04.08 Swift 메모리 관리: ARC (0) 2022.03.22 GoF Design Pattern (0) 2022.03.06 Cocoa란?(Feat. iOS, macOS) (0) 2022.03.05