Search
🐣

[iOS] App 실행 과정

부제
카테고리
iOS
세부 카테고리
LifeCycle
Combine 카테고리
최종편집일
2022/07/16 17:09
작성중
관련된 포스팅
생성 일시
2022/07/16 14:51
태그
iOS 앱은 사용자 정의 코드, 시스템 프레임워크 간의 상호작용으로 동작한다.
Custom code : 원하는 기능과 UI 구현 가능
System Framework : 편집 불가
iOS 기반의 앱이 실행되는 데 필요한 기초 환경을 제공.
공부하던 중에 알게됐는데, Objective C 기반의 앱과 Swift 기반의 앱의 실행과정이 다르더라구요.
아마도 Objective C 언어가 C언어와 굉장히 유사하기 때문인 것 같습니다.
Swift 기반 앱의 실행과정을 이해하려면 먼저 그 전신인 Objective C 기반 앱의 실행과정을 이해해야 할것 같아요.

(Objective C 기반) App 실행 과정

main() 함수로 부터 시작 됩니다.
objective C 기반의 프로젝트에서 main() 함수는 main.m 파일안에 존재하며 프로젝트 생성시 자동으로 만들어질 뿐더러 건드릴 필요가 없습니다.
int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //UIApplicationMain 함수 호출!!🔑 int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; }
Objective-C
복사
autorelease pool을 생성한다.
UIApplicationMain() 함수를 호출한다.
autorelease pool을 drain한다(?).
UIApplicationMain() 함수의 리턴 값을 호출자에게 반환한다.
Objective C 프로그램은 main() 에서 시작하고 main() 에서 끝이난다.
간단해 보이지만 모든 비밀은 UIApplicationMain() 함수 내부에 존재한다.
1.
앱이 실행되면서 맨 처음 main()함수가 실행
2.
main()함수는 UIApplicationMain()함수를 호출
3.
UIApplicationMain()함수는 UIApplication객체를 생성
4.
UIApplication객체는 info.plist 파일로부터 앱 구성에 필요한 정보들을 로드
5.
이벤트 루프 및 초기설정을 진행
6.
실행 완료 직전 application(_:didFinishLaunchingWithOptions:)메소드 호출
UIApplicationMain()함수는 iOS앱 부분의 엔트리 포인트가 된다. 객체를 생성하는 프로세스 핸들링, 개발자가 작성한 커스텀 코드를 호출, 앱 생성 초기설정을 구현한다.
반환된 객체인 UIApplication앱의 본체가 된다. 커스텀 코드들, 이벤트 루프, 푸시 등... 앱의 기능들을 모두 포함한 상위객체가 UIApplication이다. UIApplcation은 AppDelegate에게 권한을 위임하여 커스텀코드를 처리한다.

(Swift 기반)App 의 실행과정

Swift 기반 프로젝트에는 main.m 파일도 필요없을 뿐더러 엔트리 포인트도 없다.
@main 이라는 어노테이션 표기가 있는 데 어노테이션이 표시된 클래스가 app delegate 로 지정된다.
컴파일러는 @main 표기가 붙은 클래스를 자동으로 main 함수와 합성합니다.
자세한 실행과정은 아래와 같습니다.
출처 : 공식문서
실행과정에 필요한 대부분의 복잡한 과정들은 UIKit 프레임워크가 자동으로 다루어줍니다. 앱의 실행과정중에 UIKit 은 app delegate 를 호출하여 사용자 상호작용과 커스텀한 앱의 로직들을 준비할 수 있도록 합니다.
1.
사용자 또는 시스템이 앱을 실행하면, 시스템은 앱을 prewarm 합니다.
2.
시스템은 main() 함수를 실행합니다 (Xcode 제공)
3.
main() 함수가 UIApplicationMain 함수 호출, 호출된 합수는 UIApplication 객체를 생성하고, app delegate 객체를 생성합니다.
4.
UIKit은 app delegate 내부의 메서드인 application(_:willFinishLaunchingWithOptions:) 를 호출합니다.
5.
UIKit 은 UI Resotration Process 를 수행합니다.
UI Restoration process 란?
app delegate 내의 여러 추가적인 메서드와 app 의 view controller 들을 실행하는 과정.
6.
UIKit 이 app delegate 의 application(_:didFinishLaunchingWithOptions:) 메서드를 호출합니다
UIKit framework 가 main 함수를 관리해주기 때문에 직접 개발자들이 main 함수에 코드를 작성할 필요가 없어졌습니다.
main 함수를 직접적으로 다루지 못하는 대신
개발자는 앱의 실행에 대해 부분적으로 관여할 수 있긴합니다. 그방법은 바로
UIApplication 객체인데요.
이 객체의 대표적 역할은 유저의 이벤트에 반응해 앱의 초기설정을 하는 것입니다.

iOS 개발자로서 필요한 내용 정리

1.
앱 실행 완료 직전에 필요한 초기설정과 관련된 코드는 application(_:willFinishLaunchingWithOptions:) 에 작성한다.
2.
앱 실행 완료 직후에 필요한 초기설정과 관련된 코드는
application(_:didFinishLaunchingWithOptions:) 에 작성한다.
3.
앱 종료 직전에 필요한 코드는
applicationWillTerminate(_:) 에 작성한다.

Prepare Your App for Prewarming

iOS 15 이후 부터, 디바이스의 상태에 따라 시스템이 실행중이지 않은 앱을 prewarm 할 수 있습니다. prewarm 과정이란 앱을 실행하고자 할 때 앱이 사용가능해지기 까지 사용자가 기다리는 시간을 줄여주는 과정입니다. Prewarming 은 앱의 실행과정에 있어
main() 함수가 UIApplicationMain 함수를 호출하기 직전까지의 과정을 의미합니다.

총정리

1.
App 이 실행되면 main 함수가 실행됩니다.
UIKit 사용시 컴파일러가 main 함수 알아서 관리합니다.
이떄 @main 어노테이션이 붙은 appdelegate 클래스가 main 함수와 합성되게 됩니다.
2.
main 함수는 UIApplicationMain 함수를 호출합니다.
UIApplicationMain 함수는 앱의 엔트리 포인트 즉, 진입점에 해당합니다.
3.
호출된 UIApplicationMain 함수는 UIApplication 객체와 appdelegate 클래스의 객체를 생성합니다.
이 때 @main 이 표시된 delegate 클래스를 객체화 하고 이를 UIApplication 객체에 할당합니다.
4.
UIApplication 객체는 Info.plist 에서 앱 실행에 필요한 데이터들을 불러옵니다.
이때 nib 파일이 Info.plist 에 등록되어 있으면 UIApplication 객체는 해당 nib 파일 또한 불러옵니다. (UI 구성에 필요)
5.
UIApplication 객체가 Run Loop 를 포함한 이벤트처리 루프를 설정하고 이벤트 처리를 시작합니다.
앱의 Life Cycle event 시작.
6.
UIApplication 객체는 delegate 로 할당된 AppDelegate 객체에 실행환료 메시지를 전달합니다

전체과정 총정리