매주 진행하는 면접스터디에서 아래의 질문들에 대한 정리를 모은 글입니다.
Interview_Question_for_Beginner/iOS
오늘의 Swift 상식 (앱 생명주기)
앱의 실행부터 종료까지의 주기를 말한다. 앱이 foreground나 background에 있을 때 시스템 알림에 응답하고 기타 중요한 시스템 관련 이벤트를 처리하는 단계들을 말한다.
앱의 Main Run Loop는 모든 사용자가 발생시키는 이벤트에 따라 처리된다. 이벤트가 발생했을 때, UIKit에 의해 설정된 Port를 통해 내부의 Event queue에 이벤트를 담아놓고, 담겨있는 이벤트를 Main Run Loop에서 하나하나씩 실행한다.
아래 그림은 앱의 Main Run Loop의 구조와 사용자 이벤트에 의해 수행되는 조치의 결과이다. 예시는 touch event이고 다른 이벤트들 또한 비슷한 원리로 동작된다.
UIApplication 객체는 앱이 실행될 때, 이벤트가 처리될 때, View기반의 인터페이스에서 업데이트가 발생할 때 setup된다.
이름에서 볼 수 있듯이 Main Run Loop는 앱의 Main Thread를 실행하며 앱을 돌면서 모든 이벤트를 처리한다. 이를 위한 다음과 같은 규칙들이 있다.
아래의 그림에서 점선은 시스템이, 실선은 사용자가 하는 것이다.
아무것도 실행하지 않은 상태이다. 또는 실행중이지만 시스템에 의해 종료된 상태이다.
앱이 포어그라운드 상태로 돌아가지만, 이벤트는 받지 않는 상태이다. 앱의 상태 전환 과정에서 잠깐 머무는 단계이다.
일반적으로 앱이 돌아가는 상태이다. 이벤트를 받는 단계이다.
앱이 Suspended(유예 상태) 상태로 진입하기 전 거치는 단계이다.
Background 일때 작업하는 경우가 많다.
음악이나 통화와 같이 계속 앱이 실행되는 경우에는 Background일 때 동작을 한다.
보통의 앱은 Background 단계는 스쳐지나가서 바로 Suspended가 된다.
앱이 Background 상태에 있지만, 아무 코드도 실행하지 않는 상태이다. 시스템이 임의로 Background 상태의 앱을 Suspended 상태로 만든다. 리소스가 해제된다.
Launch screen은 코드를 가질 수 없다.
Suspended가 되면 Not Running과 같다고 봐야 한다.
Background로 들어가면 앱이 종료되었다고 봐야 한다.
Background에서 다시 InActive로 가는 경우를 권장한다. 즉, 앱의 데이터가 저장되어 있으면 그 화면을 보여주게 한다. 그러나 은행앱은 보안을 위해 바로 종료되어 처음부터 로그인하도록 동작한다.