0. 서론
안드로이드보다 ios의 생명주기가 단순했던 이유는 ios가 멀티테스킹이 불가능했기 때문이였습니다.
ios13이후 ios도 멀티테스킹이 가능해지면서 SceneDelegate라는 새 위임객체가 등장했습니다.
이후 AppDelegate가 관장한 생명주기 관리의 대다수가 SceneDelegate로 옮겨지게 되면서
AppDelegate는 앱의 초기 구동 및 전체에 관련된 이벤트의 처리정도를 담당하게 되며 기능이 축소됬습니다.
단, Scene 기능은 명시적으로 사용(opt-in)해야하기 때문에 info.plist에 키를 추가해주지 않으면
SceneDelegate은 사용할 수 없고 ios13이전처럼 AppDelegate이 생명주기를 관장하게 됩니다.
그러므로, 우리는 둘 다 공부해야 합니다 ^-^....흑
1. Application의 실행 과정
최초에 main 함수가 실행되며 UIApplicationMain 함수를 호출합니다.
호출된 UIApplicationMain함수는 UIApplication 객체를 생성하는데요,
UIApplication은 싱글톤 객체로 하나만 존재하는 앱 객체 그 자체이며, 여러 이벤트를 감지합니다.
그리고 그외에 필요한 데이터를 로드합니다.
마지막으로 AppDelegate 객체가 만들어져 UIApplication와 연결이 되고 runLoop가 만들어집니다.
그리고 Evenp Lopp을 실행하면서 유저의 이벤트를 구독할 준비도 마칩니다.
그리고 실행준비가 완료되어 실행 직전에 UIApplication가 AppDelegate에게 메세지를 보내게 됩니다.
'application:didFinishLaunchingWithOptions'
2. iOS의 생명주기
우선 생명주기란 이름그대로 실행부터 종료될떄까지의 상태 및 변화입니다.
앱에 상태는 리소스의 우선순위나 가능한 행위에 영향을 미치기 때문에 필수적으로 공부해야 하는 사항입니다.
이유를 예로 들어 보자면,
앱이 백그라운드 상태일때 리소스가 부족하다면 ios는 백그라운드 앱을 종료시킬 수 있습니다.
이때, 앱이 백그라운드 상태가 될 때 데이터를 저장하거나 송신해두지 않는다면 데이터가 손실될 위험이 있는 것이죠.
이렇듯 상태에 따라 앱의 행동을 조절해줘야 할 때가 있는데, 이를 위해 UIKit은 delegate에 메세지를 보내게 됩니다.
a. Scene 기반 생명주기
*scene이란? scene은 UI인스턴스와 1:1 대응이며 하나의 앱은 여러 scene을 가질수 있는데, 띄우거나 숨길 수 있다.
그리고 scene마다 고유한 수명주기를 가지기 때문에 한 앱이여도 scene은 다른 실행상태에 있을 수 있습니다.
scene의 상태변환을 순서대로 서술해 보겠습니다.
사용자/시스템이 새로운 scene을 요청하면 UIKit이 요청한 scene을 생성하고 unattached상태로 만듭니다.
여기서 요청한 주체에 따라서 출발점이 달라지는데요,
사용자가 요청한 scene은 foreground inactive상태를 거쳐 active상태가 됩니다.
반면 시스템이 요청한 scene은 일반적으로 이벤트처리를 위해 background 상태가 되고,
이벤트를 처리한다면 Foreground inactive 상태가 됩니다.
사용자가 앱의 UI를 닫으면 UIkti은 연결된 scene은 background 샅애가 되고 Suspended 상태가 됩니다.
UIkit은 리소스를 회수하기 위해 언제든지 background나 suspended 상태인 scene을 회수해
unattached 상태로 되돌릴 수 있습니다.
장면 전환을 사용해 다음 작업을 수행할 수 있습니다.
- UIKit이 scene을 앱에 연결하면 scene의 초기 UI가 설정되며 scene에 필요한 데이터가 로드됩니다.
- foreground active 상태로 전환할 때 UI를 설정하고 사용자와 상호작용할 준비를 합니다.
- foreground active 상태에서 inactive데이터를 저장하고 앱의 주요 동작을 멈춥니다.
- background 상태가 되면 중요한 작업을 마무리하고 메모리를 최대한 해제합니다. 앱의 스냅샷을 찍을 준비도 합니다.
- scene의 연결이 끊어지면 scene과 관련된 모든 리소스를 해제합니다.
- 앱의 실행은 appDelegate를 사용해야 하며, 앱scene의 생성과 삭제또한 appDelegate가 관여합니다.
* 앱의 주요 동작을 멈춘다는 의미는 다음과 같습니다.
- 사용자 데이터를 저장하고 파일에 담는다.
- dispatchQueue, OperationQueue의 동작 중지.
- 새로운 Operation이 스케쥴되지 않음.
- 모든 타이머를 무효화 시키고 게임을 자동으로 일시정지.
b. App기반 생명주기
장면 전환을 사용해 다음 작업을 수행할 수 있습니다.
- 앱이 최초로 실행되면 앱의 자료구조와 UI를 초기화 하게 됩니다.
- active 상태가 되면 UI설정을 마치고 사용자와 상호작용을 할 준비를 합니다.
- inactive 상태가 될 때, 데이터를 저장하고 앱의 주요 동작을 멈춥니다.
- background 상태가 될 때, 중요한 작업을 마무리하고 메모리를 최대한 해제해줍니다.
- 그리고 앱이 종료되면 모든 작업은 중지되며 모든 리소스가 해제됩니다.
각 항목을 간단히 정리하면 아래와 같습니다.
- NotRunning : 앱이 실행되지 않는 상태
- Inactive : 앱이 실행중 (아무런 이벤트를 받지 않음)
- Active : 앱이 실행 중 (이벤트 발생)
- Background : 앱이 백그라운드에 위치 (실행되는 코드가 있음)
- Suspened : 앱이 백그라운드이 위치 (실행되는 코드가 없음)
active-inactive개념이 살짝 혼란스러울 수 있는데요..
앱은 active 상태와 background로 전환되며 요청을 처리하는데,
둘의 중간전환단계가 inactive상태라고 생각하면 이해가 쉽겠네요.
안드로이드 공부할때도 본격적으로 개발전에 생명주기를 공부했어서
그 기억으로 생명주기를 먼저 공부해봤습니다 ^^...
공부에 도움이 된 사이트
애플 디벨로퍼 공식 문서
developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
애플 디벨로퍼 공식 문서를 참고작성한 훌륭한 정리
jcsoohwancho.github.io/2019-09-20-iOS앱의-생명주기/
'IDE & Framework > iOS' 카테고리의 다른 글
m1 기반 mac에서 cocoapod 사용하기 (0) | 2021.04.20 |
---|---|
Storyboard 사용해보기 (0) | 2021.04.15 |
ios Stroyboard란? (0) | 2021.04.14 |
[기상알리미] application preview (0) | 2021.04.13 |
iOS 특징 (0) | 2021.04.06 |