iOS | 앱의 초기화 과정

youjin·2022년 7월 1일
0
post-thumbnail

오늘은 사용자가 앱의 icon을 클릭했을 때, iOS 앱이 실행되는 절차에 대해 알아봅시다.
iOS 앱이 Swift 기반일 때와, Objective-C 기반일 때로 구분하여 알아볼게요.

먼저 Objective-C 기반의 iOS 앱 초기화 과정을 확인해봅시다. 메인 nib 파일을 사용하지 않는 경우입니다.



Objective-C 기반의 iOS 앱 초기화 과정

아래는 사용자가 Objective-C 기반의 iOS 앱을 터치한 후의 앱 초기화 과정입니다.

1. main() 함수 실행

Objective-C는 C 프로그래밍 언어에 스몰토크 스타일의 메시지 구문을 추가한 객체 지향 언어입니다.
C 언어에 뿌리를 둔 모든 애플리케이션은 main() 함수로부터 시작되며, 이를 엔트리 포인트(Entry Point, 시작 진입점) 라고 합니다.

Objective-C 역시 C 언어에 기반하고 있기 때문에, 이를 이용하여 만들어진 iOS 앱도 main() 함수로부터 시작됩니다.

Xcode로 프로젝트를 생성하면 main()함수가 자동으로 만들어지는데, 이는 우리가 전혀 건드릴 필요가 없습니다. 아래는 실제로 Objective-C 기반의 Xcode 프로젝트를 생성했을 때 main.m 파일 안에 생성되는 main() 함수입니다.


#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[] {
	@autoreleasepool {
    	return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

2. UIApplicationMain() 함수 실행

main() 함수는 실행 시 시스템으로부터 전달받은 두 개의 인자 값 argc, argv와 AppDelegate 클래스를 이용하여 UIApplicationMain() 함수를 호출합니다.


	// 두 개의 인자 argc, argv와 AppDelegate 클래스를 가지고 UIApplicationMain 함수 실행
	return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    

3. UIApplication 객체 생성

main() 함수에 의해 호출된 UIApplicationMain() 함수는 UIApplication 객체를 반환합니다.
생성된 UIApplication 객체는 UIKit 프레임워크에 속해있으므로 이후의 앱 제어권은 iOS 에서 UIKit 프레임워크로 이관됩니다.

이때 생성된 UIApplication은 앱의 본체라고 할 수 있는 객체로, 사실상 앱 그 자체를 의미합니다.
Int 리턴타입으로 쓰여있지만, 절대 return 되지 않습니다.


func UIApplicationMain(
    _ argc: Int32,
    _ argv: UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>,
    _ principalClassName: String?,
    _ delegateClassName: String?
) -> Int32


4. UIApplication의 앱의 데이터와 객체 로드

UIApplicationMain() 함수에 의해 생성된 UIApplication 객체는 Info.plist 파일을 바탕으로 앱에 필요한 데이터와 객체를 로드합니다.


5. AppDelegate 객체 생성, UIApplication과 연결, 이벤트 루프 생성 및 앱 실행 준비

UIApplication은 서브 클래싱을 하는 경우도 드물고, 별로 그럴 이유도 없으며 그게 쉽지도 않습니다. 하지만 분명히 앱의 라이프 사이클의 여러 스테이지에서 수행되어야 하는 일은 있습니다.
따라서 UIApplication 객체 클래스를 직접 서브 클래싱하지 않고 AppDelegate를 통해 처리하게 됩니다.

AppDelegate 객체는 iOS 애플리케이션 내에서 오직 하나의 인스턴스만 생성되도록 시스템적으로 보장받으며,
앱이 처음 만들어질 때 객체가 생성되고, 앱이 실행되는 동안 계속 유지되다가 앱이 종료되면 그때 함께 소멸하는 등 앱 전체의 생명 주기와 함께 합니다.

AppDelegate 객체 생성과 UIApplication과 연결이 마무리된 후에 이벤트 루프를 만드는 등 실행에 필요한 준비를 진행합니다.


6. AppDelegate의 application(_:didFinishLAunchingWithOptions:) 함수 호출

앱이 실행되기 직전, AppDelegate 클래스에 작성된 application(_:didFinishLAunchingWithOptions:) 메소드가 시스템에 의해 자동으로 호출됩니다. 해당 메소드에 원하는 커스텀 코드를 작성해두면 앱이 처음 시작될 때 해당 코드를 실행할 수 있습니다.





Swift 기반의 iOS 앱 초기화 과정

아래는 사용자가 Swift 기반의 iOS 앱을 터치한 후의 앱 초기화 과정입니다.

1. @main, @UIApplicationMain 어노테이션이 붙은 클래스 실행

Swift 기반의 iOS 앱은 main.m파일도 없고, 엔트리 포인트도 없습니다. Swift 기반의 iOS 앱의 초기화 과정은 Objective-C 기반의 iOS 앱 초기화 1-5 과정을 @UIApplicationMain이라는 어노테이션 표기로 대체합니다.
해당 어노테이션 표기를 통해 AppDelegate 클래스 정보를 시스템에게 전달하여 앱의 초기화를 진행합니다.
iOS 시스템은 앱을 실행할 때 해당 어노테이션이 표시된 클래스를 찾아 실행하고 델리게이트로 지정하게 됩니다.

그 이후는 Objective-C 기반의 iOS 앱 초기화 과정과 동일합니다.


2. AppDelegate의 application(_:didFinishLAunchingWithOptions:) 함수 호출

앱이 실행되기 직전, AppDelegate 클래스에 작성된 application(_:didFinishLAunchingWithOptions:) 메소드가 시스템에 의해 자동으로 호출됩니다. 해당 메소드에 원하는 커스텀 코드를 작성해두면 앱이 처음 시작될 때 해당 코드를 실행할 수 있습니다.





1개의 댓글

comment-user-thumbnail
2022년 8월 16일

ios관련 영상 찾다가 유튜브에서 뵌 분 같네요ㅎㅎ
글 잘 읽었습니다~

답글 달기