AppDelegate.swift 파일의 두 가지 주요 기능
iOS 프로젝트를 생성하면 자동으로 생성되는 AppDelegate.swift 파일은 두 가지 주요 기능을 담당한다.
첫 번째는 AppDelegate 클래스를 정의하는 것, 두 번째는 App 이 시작되는 진입점인 Entry point 를 알려주고, App 의 입력 이벤트를 전달하는 RunLoop 를 생성하는 역할을 하는 것이다.
Playground 와 같이 위에서부터 아래로 차례대로 실행되는 단일 파일 기반의 절차적 코드를 작성할 때에는 앱이 어디서 시작하는지는 큰 상관이 없었다. 그러나 UIKit 과 같은 프레임워크 기반 프로그램은 다르다. 파일에는 그저 타입과 그 멤버들을 선언만 하였지, 언제 어떻게 실행시키는지는 전혀 적지 않았으므로, 우리는 프로그램의 시작점인 Entry Point 를 정의해야한다.
이를 @main(5.3v 이전 @UIApplicationMain) 어노테이션이 담당한다. App 을 실행하면 진입점을 정의해주는 @main 어노테이션을 찾고, 그 클래스를 실행한다.
App 실행 과정과 함께 알아보기
Xcode 에서 새 iOS 프로젝트를 만들고 앱이 어디서 부터 시작되는지 알기위해 main() 함수 혹은 "main.swift" 파일을 찾아 보면, 쉽게 찾을 수가 없다. iOS 기본 템플릿에선 Swift 파일에 @UIApplicationMain을 포함함으로서(swift 5.3v 이후 @main), 컴파일러가 iOS 앱의 진입점을 합성하기 때문에 따로 "main.swift"파일이 필요하지 않기 때문이다.
그렇다고 main()함수가 존재하지 않는 것은 아니다. Swift 기반의 iOS 프로젝트에서는 UIKit 프레임워크가 이를 숨겨서 관리하므로 찾기가 힘든 것이다.
UIApplicationMain 함수는 @main 어노테이션을 찾고, 그 클래스를 실행하는데, 처음 iOS 프로젝트를 만들면 다음과 같이 AppDelegate Class 위에 @main 어노테이션이 붙어있다.
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
...
}
한마디로 프로그램의 진입점은 AppDelegate 클래스이고, UIApplicationDelegate 프로토콜에 작성된 정적 main() 함수를 호출하면서 App 의 생명주기가 시작되는 것이다.
extension UIApplicationDelegate {
@MainActor public static func main()
}
' iOS > Swift' 카테고리의 다른 글
App Thinning 이란? (2) | 2022.10.06 |
---|---|
왜 UI 를 메인 스레드에서 업데이트 해야 할까? (0) | 2022.09.25 |
iOS 4계층 (0) | 2022.09.18 |
Breakpoint 과 디버깅 버튼 / 단축키 (0) | 2022.09.18 |