C언어 기반의 프로그래밍 언어에서는 main이라는 함수가 앱의 시작이 된다.
iOS 앱 또한 Objective-C 기반에서 돌아가기 때문에 앱은 main 함수에서 시작된다.
iOS 애플리케이션 실행 순서
- main 함수 실행
- main 함수에서 UIApplicationMain 함수 실행 (앱의 본체에 해당하는 객체인 UIApplication 객체 생성)
- Info.plist 파일을 읽어들여 파일에 기록된 정보를 참고하여 그 외에 필요한 데이터 로드.
(Main nib 파일을 사용하는 경우 이 과정에서 로드됨.) - Main nib 파일이 없거나 그 속에서 앱 델리게이트가 없는 경우, 앱 델리게이트 객체를 만들고 앱 객체와 연결.
- 런루프를 만드는 등 실행에 필요한 준비를 마무리함.
- 실행 완료를 앞두고, 앱 객체가 앱 델리게이트에게 application:didFinishLaunchingWithOptions: 메시지를 보냄.
UIApplicationMain 함수: 앱 로딩 프로세스
파라미터
- principalClassName: 앱 객체가 될 클래스 이름. nil이면 UIApplication으로 대체
- appDelegateClassName: 앱 델리게이트 클래스 이름.
기능
- 앱의 본체에 해당하는 객체인 UIApplication 객체 생성, 이 객체는 앱의 Life Cycle 관리
- 지정된 클래스(@UIApplicationMain이 표시된)에서 델리게이트를 인스턴스화 하고 이를 앱의 객체에 할당
- 앱의 Run Loop를 포함한 기본 이벤트처리 루프를 설정하고 이벤트 처리 시작
- 앱의 info.plist에 불러올 main nib 파일이 명시되어있으면, 해당 nib 파일을 불러옴.
이제 @main에 대해 알아보자.
Swift 기반으로된 iOS 프로젝트는 main 파일이 없다. 그이유는?
@main을 선언하여 iOS 앱의 진입점을 컴파일러가 합성하기 때문.
@main을 선언해줌으로써, UIKit 앱의 진입점은 해당 클래스이고, 시스템은 UIApplicationDelegate 프로토콜에 구현되어있는 정적 main() 함수를 호출함.
(추가) Swift 5.3부터 프로그램의 entry point를 알려주는 속성이 @UIApplicationMain에서 @main으로 변경됨.
Ref.
https://developer.apple.com/documentation/uikit/1622933-uiapplicationmain
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/3656306-main
https://barosalki.tistory.com/entry/iOS-Swift-53-main-type기반의-프로그램-진입점
https://soooprmx.com/앱델리게이트-이해하기-ios앱-만들기-01/
https://hcn1519.github.io/articles/2017-09/ios_app_lifeCycle
https://oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/
'iOS > iOS 본질을 파헤치쟈' 카테고리의 다른 글
iOS 접근성 개발 참고 자료 (0) | 2021.08.25 |
---|---|
[iOS] UNUserNotificationCenter, Push Notification 권한 요청 방법 (0) | 2021.07.06 |
[iOS] Autolayout Engine 동작 방식 (0) | 2019.12.09 |