iOS 앱 실행과 UI 프레임워크 정리 (TIL)
@main
- 앱의 엔트리 포인트를 지정해주는 애노테이션
main() 함수가 가장 먼저 실행되며, Swift에서는 @main을 사용해 앱의 시작 지점을 표시함
- 애플리케이션 구조체나 클래스에 붙여 앱 실행 시작점을 정의할 수 있음
앱의 실행과정
- main() 함수 실행
- UIApplicationMain() 함수 호출
- UIApplication 객체 생성 (앱의 본체)
- 관련 리소스 로드 (Storyboard, Nib, Info.plist 등)
- AppDelegate 객체 생성 → UIApplication과 연결
- Main Run Loop 실행 준비
- 앱 실행 완료 직전
application(_:didFinishLaunchingWithOptions:) 호출
- SceneDelegate를 통해 초기 UI 구성
AppDelegate
- 앱 전체의 라이프사이클과 전역 설정을 담당하는 클래스
- UIApplication의 델리게이트 객체
- 앱 실행 시작/종료, 푸시 알림 등록 등 시스템 이벤트를 처리
SceneDelegate
- 화면에 무엇을 보여줄지 결정하는 UI Scene 관리 객체
- iOS 13 이상에서 멀티 윈도우 지원을 위해 도입됨
- 각각의 Scene은 앱 내에서 독립적인 UI 인스턴스
주요 컴포넌트
scene(UIScene)
- 앱 UI의 각 인스턴스를 관리
- 하나의 Scene이 여러 개의 Window나 ViewController를 가질 수 있음
WindowScene(UIWindowScene)
UIScene의 서브클래스
- 하나 이상의
UIWindow를 관리
- 직접 인스턴스를 생성할 수 없음
- Info.plist에서 설정 필요
UISceneSession
- 앱의 여러 Scene 중 하나의 Scene에 대한 정보를 담고 있음
- Scene 복원 등에 사용됨
Scene의 상태 (Life Cycle)
Not Running: 앱이 시작되지 않음
Inactive: 실행 중이나 사용자 이벤트를 받지 않음
Active: 포그라운드에서 이벤트 수신 중
Background: 백그라운드에 있으며 작업 수행 가능
Suspended: 백그라운드에서 실행 중지, 메모리만 보유
UIViewController Life Cycle
loadView: 뷰 계층을 코드로 생성할 때 호출
viewDidLoad: 뷰가 메모리에 로드된 직후
viewWillAppear: 뷰가 나타나기 직전
viewDidAppear: 뷰가 나타난 직후
viewWillDisappear: 뷰가 사라지기 직전
viewDidDisappear: 뷰가 사라진 직후
UIResponder
- UIKit의 이벤트 처리 시스템의 핵심 클래스
- 터치, 모션, 리모콘 이벤트 등을 처리하거나 전달함
- 대부분의 UIKit 클래스는 UIResponder를 상속받음 (UIView, UIViewController 등)
이벤트 전달 방식
- Responder Chain을 사용하여 이벤트를 적절한 객체로 전달
- 이벤트를 처리하거나, 다른 responder에게 전달 가능
First Responder
- 가장 먼저 이벤트를 받는 객체
- UIKit은 이벤트 발생 시 적절한 First Responder를 탐색함
- 예: UIControl은 타깃-액션 메커니즘으로 이벤트 처리
- Shake-motion 이벤트는 Responder Chain을 사용하지 않고 CoreMotion으로 전달
Hit Testing
- UIKit은 View 기반의 Hit-testing을 통해 터치 이벤트 처리
- 이벤트가 발생한 위치(CGPoint)를 기준으로 최하단 View 탐색
- 해당 View가 First Responder로 지정되어 이벤트 수신
- 비활성화(예: hidden) 되어 있으면 무시되고 상위 View 탐색