앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?

seuhong·2024년 1월 23일
0

iOS interview Question

목록 보기
6/11
post-thumbnail

답변

UIApplication 인스턴스가 생성됨, 이때 UIApplication은 사용자로부터 발생하는 이벤트들을 AppDelegate로 전달하는 역할을 함


iOS 개발자라면 근본적으로 알아야 할 App Life Cycle에 관련된 질문이다.

사용자가 앱 아이콘을 눌러 앱을 실행하게 되면 위와 같은 형태의 생명주기를 통해 메모리에 할당되었다가 소멸됨.
여기서 swift 이전에 objc로 작성되었던 앱은 c기반이었기 때문에 앱이 실행될 때 운영체제가 가장먼저 main.m 파일 안의 main()함수를 호출하여 앱이 시작된다.

swift가 c언어 기반은 아니지만 objc와 함께 사용되는 언어이기 때문에 동일하게 main() 함수를 호출하는데, 우선 xcode로 생성한 iOS개발 템플릿에는 main.swift 파일은 보이지 않는다. 이는 UIKit 프레임워크 안에 main()함수를 숨겨놓았기 때문이다. 따라서 앱이 실행되면 가장 먼저 운영체제가 개발자는 찾을 수 없는 main() 함수를 호출하며, main()함수는 뒤이어 UIApplicationMain() 함수를 호출하여 UIApplicaiton 객체가 생성되는 것이다.

swift는 main함수가 없지만 @main이라는 어노테이션 표기가 있음 → 이 표기를 통해서 objc의 이벤트 루프 및 초기설정 진행을 진행하는 과정이 대체된다.
UIApplicationMain → 코코아터치 프레임워크에서 앱의 LifeCycle을 실행하는 함수

  1. @main 어노테이션을 찾고 그 클래스를 실행한다.
  2. AppDelegate 클래스의 application(_:DidFinishLaunchingWithOptions:)메소드를 호출함
    (앱이 실행될 때 처리할 내용이 있으면 여기에 작성함)
  3. 이벤트 루프를 실행하고 작성한 코드들이 실행됨
  4. 앱이 종료될 때 앱에대한 메모리 제거를 위해서 applicationWillTerminate(_:)메소드를 호출함
    (앱이 종료될 때 처리할 내용이 있으면 여기에 작성함)

정리

  1. UIApplicationMain은 UIApplication 과 App delegate 인스턴스를 생성함.
  2. AppDelegate 객체가 UIApplication 내부에 전달됨
  3. UIApplication 객체가 delegate 객체를 통해서 앱과 시스템의 상호작용함.
  4. iOS 13부터는 scene delegate가 이 역할을 하며 합쳐져 있음.
  5. delegate객체는 window를 가지고 있으며, window는 모든 UIView의 최상위 관리 객체로 존재함.
profile
완씨의 개발기록

0개의 댓글