iOS 개발을 배우기 시작한지 3주가 되었다. 그동안 Swift 문법을 배웠고 이제 iOS 앱에 대해
배우기 시작했다. 처음 접하는 내용이라 조금은 어렵게 느껴졌지만 계속해서 보다보니 이제 좀 이해가 간다. 그래서 내가 이해한 내용을 정리하기 위해 블로그 포스팅을 한다.
iOS App Structure
iOS 앱은 앱을 구성하는 데이터인 Model과 앱의 전반적인 로직을 담당하는 Controller, 그리고 결과물을 화면에 표시해 주는 View로 구성되어 있다. 그리고 이것을 일반적으로 MVC 패턴이라고 한다.
기본적인 구조는 이와 같고 오늘 할 이야기인 앱의 LIFE CYCLE에 대해 알아보겟다.
앱의 상태는 아래 그림과 같이 변한다.
iOS에서 앱은 이와 같은 상태변화를 거치며 실행되고 종료된다. 그리고 델리게이트 패턴에 따라 각 시점마다 호출되는 메소드들이 있다. 델리게이트 패턴은 iOS 개발에서 매우 중요한 앱 디자인 패턴으로 내용이 길어질 것 같으니 여기서는 단순히 한 객체에서 처리할 일을 해당 프로토콜을 구현하고 있는 다른 객체에게 일임하는 것이라고 하자. 델리게이트 패턴에 대해서는 따로 포스팅 하기로 하겠다.
앱 상태 변화에 따른 메소드들은 아래와 같다.
처음에 앱을 실행하면 제일 먼저 willFinishLaunchingWithOptions: 가 호출되고
그 다음으로 DidFinishLaunchingWithOptions 이 호출된다. 그리고 앱이 Active상태가 된 직후applicationDidBecomeActive 메소드가 호출된다.
이 과정을 그림으로 설명하면 아래와 같다
앱이 Active상태로 들어가면 Event Loop 가 돌면서 사용자가 화면을 터치하거나 하는 이벤트를 순서대로 처리한다.
사용자가 홈버튼을 누르거나 다른 앱으로 넘어갈 때 내부적으로 applicationWillResignActive: 메소드가 호출되고 앱이 inActive상태를 거쳐 Background상태로 들어가면 applicationDidEnterBackground: 메소드가 호출된다.
Background상태에서 음악을 재생한다거나 네비게이션이 작동한다거나 하는 동작이 없으면 앱은 다시 Suspended 상태로 넘어간다. 이 상태는 메모리에서 내려진 상태는 아니지만 시스템에 메모리가 부족하면 OS가 알아서 메모리에서 해제한다.
앱이 백그라운드 상태로 넘어가다가 넘어가지 않고 다시 복귀하는 경우가 있는데 이것은 예를 들면 앱을 사용중에 전화가 오면 전화라는 이벤트, 즉 인터럽트가 발생한 것으로 시스템은 실행중이던 앱을 잠시 멈추고 applicationWillResignActive:메소드를 호출한다. 그리고 전화를 받을 것인지 거절 할 것인지 묻는다. 거절하면 다시 실행중이던 앱으로 돌아가게되고 applicationDidBecomeActive: 메소드가 호출된다. 그리고 다시 이벤트 루프가 돌게 된다. 거절하지 않고 전화를 받으면 실행중이던 앱은 백그라운드 상태로 들어간다.
백그라운드 상태의 앱을 다시 실행시키면 applicationWillEnterForeground: 메소드가 실행되며 앱은 Foreground상태로 진입한다. 그리고 applicationDidBecomeActive: 메소드가 호출된다. 그리고 실행중인 앱은 다시 Active 상태로 넘어가고 시스템은 이벤트 핸들링을 시작한다.
이와 같은 전체적인 그림은 아래와 같다.