본문 바로가기

Swift/Foundation

App Lifecycle

 

 

오늘 다룰 내용은 현재 공식문서에서 숨겨진 내용을 포함한다.

RunLoop는 무엇일까라는 고민에서부터 출발했고, 여러 블로그 글을 정리해서 작성했다.

 

 

storyboard를 사용할 때도 시작점을 설정하고, view를 코드로 작성할 때도 시작점을 설정해야 한다.

App Lifecycle을 공부하면서 한 번도 main함수에 대해서 생각을 해본 적이 없다.

이 글은 application(_:willFinishLaunchingWithOptions:)을 부르기 전부터 시작한다.

 

 

 

start 함수는 화면에서 앱을 실행시킬 때 호출되며 내부적으로 main 함수가 호출된다.

Swift만 사용했다면 main 함수를 한 번도 본적이 없을 것이다.

objc를 사용했다면 main.m 파일이 있지만, Swift는 아래 코드를 보면 @UIApplicationMain이라는 주석으로 처리한다.

iOS 앱에서는 UIKit 프레임워크가 main 함수를 관리하고 프로그래머가 작성하지 않아도 괜찮다.

원한다면 주석을 지우고 프로그래머가 직접 작성할 수도 있다.

 

main 함수 안에서 실행되는 UIApplicationMain함수는 앱에 몇 가지 중요한 객체를 생성하고

스토리보드에서 UI를 로딩하고 앱의 초기 세팅값(info.plist)을 불러오고

앱을 Run loop에 올려놓으며 함수를 진행한다.

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

// Objc
int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

 

 

The Structure of App

UIApplicationMain 함수에서부터 생성된 UIApplication객체는 

모든 iOS앱의 중심에는 시스템과 앱의 여러 객체들 간에 대화를 가능하게 해준다.

아래 그림과 같이 iOS App 구조는 MVC로 구현되어 있다. 데이터와 뷰를 서로 독립적으로 분리해서 

서로 다른 크기가 다른 기기에서도 동작할 수 있게 만들었다.

 

UIApplication 앱이 실행될 때 Event Loop를 생성한다.
Event Loop를 관리하고 델리게이트에게 앱 상태변화나 푸시 같은 중요한 이벤트를 알려준다.
Application Delegate UIApplication 객체와 함께 앱초기화, 상태 변화등 중요한 이벤트를 관리한다.

 

 

The Main Run Loop

사용자가 기기에서 특정 액션을 취하면, 시스템으로부터 이벤트가 생성된다. 

해당 이벤트는 UIKit에서 생성한 포트를 통해 앱으로 전달되고, 이벤트는 앱 내부적 큐에 저장되고 차례대로 동작한다.

UIApplication 객체가 이벤트를 핸들링한다.

 

 

 

States for Apps (iOS 12.0 기준)

  • Not Running: App이 아직 실행되지 않았거나 시스템이 완전히 종료된 상태

  • Inactive(foreground): Launch screen ,App이 실행중이지만 시스템 알림(통화)이 화면을 덮어서 이벤트를 받지 못하는 상태

  • Active(foreground): App이 실행중이고 이벤트를 받고 있는 상태

  • Background: App이 다른 앱으로 전환되거나 홈 화면으로 나갔을 때 실질적으로 동작을 하고 있는 상태(음악)

  • Suspended: 앱을 다시 실행할 경우 빠른 실행을 위해 메모리에만 올라가 있는 상태(메모리가 부족하면 release시켜서 메모리를 확보한다.)

 

AppDelegate 

  • application(_:willFinishLaunchingWithOptions:): 시작(launch) 프로세스가 시작되었지만, 상태 복원은 아직 발생하지 않은 상태

  • application(_:didFinishLaunchingWithOptions:): 시작 프로세스가 거의 완료되었으며 앱을 실행할 준비가 거의 끝난 상태

  • applicationWillEnterForeground(_:): background에서 foreground로 진입 시 호출된다.

  • applicationWillResignActive(_:): active에서 in active로 진입 시 호출된다.

  • applicationDidEnterBackground(_:): foreground에서 background로 진입 시 호출된다.

  • applicationWillTerminate(_:): 앱이 종료되기 직전에 호출된다.

 

 

 

Summary 

이번 글은 App Lifecyle을 기존에 존재하는 AppDelegate에서 관리하는 메소드 중심의 글이 아닌

그 이전 메소드를 중점으로  정리했다.

아래 그림을 보면 위에서 정리한 내용을 혼자서 다시 한 번 생각해보면 좋겠다.

 

 


 

다시 한번 옛날 자료를 보관해준 사람들에게 감사를 표합니다.

 

 

Reference

jinshine.github.io/2018/05/28/iOS/앱의%20생명주기(App%20Life%20Cycle)와%20앱의%20구조(App%20Structure)/

rhammer.tistory.com/94

'Swift > Foundation' 카테고리의 다른 글

@autoreleasepool  (0) 2020.09.10
POP  (0) 2020.08.29
Any, AnyObject  (0) 2020.08.07
Properties  (0) 2020.08.06
Dispatch Queue  (0) 2020.08.04