C언어 기반의 프로그래밍 언어에서는 main이라는 함수가 앱의 시작이 된다.
iOS 앱 또한 Objective-C 기반에서 돌아가기 때문에 앱은 main 함수에서 시작된다.

 

iOS 애플리케이션 실행 순서

  1. main 함수 실행
  2. main 함수에서 UIApplicationMain 함수 실행 (앱의 본체에 해당하는 객체인 UIApplication 객체 생성)
  3. Info.plist 파일을 읽어들여 파일에 기록된 정보를 참고하여 그 외에 필요한 데이터 로드.
    (Main nib 파일을 사용하는 경우 이 과정에서 로드됨.)
  4. Main nib 파일이 없거나 그 속에서 앱 델리게이트가 없는 경우, 앱 델리게이트 객체를 만들고 앱 객체와 연결.
  5. 런루프를 만드는 등 실행에 필요한 준비를 마무리함.
  6. 실행 완료를 앞두고, 앱 객체가 앱 델리게이트에게 application:didFinishLaunchingWithOptions: 메시지를 보냄.

Objective-C 기반 iOS 프로젝트 main.m 파일

 

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.

+ Recent posts