[TIL] 앱이 시작할 때 main.m에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가? + @

숑이·2023년 7월 23일
0

iOS

목록 보기
6/26
post-thumbnail
post-custom-banner

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

UIApplication 싱글톤 객체가 생성됩니다.

UIApplication은 어떤 역할을 하나요?

iOS에서 실행되는 앱들의 관리와 협력의 중심점 역할을 합니다. 해당 객체가 생성되고 나서야 개발자가 작성한 코드대로 이벤트 처리 등 앱의 동작을 제어할 수 있습니다.

앱의 실행 과정

Objective-C

  1. 앱이 실행되면서 맨 처음 main() 함수 실행
  2. main() 내부에서 UIApplicationMain() 함수 호출
  3. UIApplicationMain()함수가 UIApplication객체를 생성합니다.
  4. UIApplication객체는 info.plist 파일로부터 앱 구성에 필요한 정보들을 로드 합니다.
  5. Event Loop 및 초기 설정을 진행합니다.
  6. 실행 완료 직전에 app delegate의 application(:didFinishLaunchingWithOptions)메소드가 호출됩니다.

Swift

Swift기반의 프로젝트에서는 main() 함수가 보이지 않습니다. 그렇다고 main() 함수가 없는 것은 아니고, UIKit 프레임워크가 이를 숨겨서 관리하고 있는 것 입니다. Objective-C 기반 프로젝트에서는 main() 함수가 앱의 시작지점(Entry Point) 역할을 했었는데, Swift에서는 컴파일러가 @main 어노테이션을 통해 AppDelegate에서 전역범위에 있는 코드를 자동으로 인식하게 하고, 실행시켜 Entry Point를 지정되게 합니다.

  1. @main 어노테이션을 찾고 그 클래스를 실행합니다.
  2. AppDelegate클래스의 application(:didFinishLaunchingWithOptions)메소드를 호출합니다.(앱이 실행될 때 처리할 코드 작성)
  3. 이벤트 루프를 실행하고, 작성한 코드들이 실행됩니다.
  4. 앱이 종료될 때 앱에 대한 메모리 제거를 위해 applicationWillTerminate(:)메소드를 호출합니다.(앱이 종료될 때 처리할 코드 작성)

@main에 대해서 설명하시오.

@main은 프로그램 실행 시작 시 진입점으로 타입을 지정하기 위한 Swift 언어의 기능입니다.

앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나요?

  • Foreground mode는 메모리 및 기타 시스템 리소스에 높은 우선순위를 가지며, 시스템은 이러한 리소스를 사용할 수 있도록 필요에 따라 background 앱을 종료합니다.

  • Background mode는 가능한 적은 메모리 공간을 사용해야합니다. 따라서 사용자 이벤트를 받기 어렵고, 메모리가 부족한 상황이라면 운영체제에 의해서 background 상태의 앱이 종료될 수 있습니다.

상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.

application(_:didFinishLaunching:) - 앱이 처음 시작될 때 실행
applicationWillResignActive: - 앱이 active 에서 inactive로 이동될 때 실행
applicationDidEnterBackground: - 앱이 background 상태일 때 실행
applicationWillEnterForeground: - 앱이 background에서 foreground로 이동 될때 실행 (아직 foreground에서 실행중이진 않음)
applicationDidBecomeActive: - 앱이 active상태가 되어 실행 중일 때
applicationWillTerminate: - 앱이 종료될 때 실행

scene delegate에 대해 설명하시오.

scene delegate는 애플리케이션이 화면에 표시되는 방식과 애플리케이션의 생명주기를 담당합니다.

iOS12까지는 대부분 하나의 앱에 하나의 window 였지만, iOS13부터 window의 개념이 scene으로 대체되고 하나의 앱에서 여러개의 scene을 가질 수 있게 되었습니다. (ex. iPad의 멀티 윈도우)

그로 인해, 원래 AppDelegate의 역할이었던 UILifeCycle에 대한 부분을 SceneDelegate가 하게 되었고, AppDelegate에는 Scene Session이 생성되거나 삭제되는 것을 관리하는 Session LifeCycle에 대한 역할이 추가 되었습니다.

App의 Not running, Inactive, Active, Background, Suspended에 대해 설명하시오.

Not Running

앱이 아직 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태입니다.

Inactive

앱이 실행중이지만, 사용자로부터 event를 받을 수 없는 상태입니다.
멀티 태스킹 윈도우로 진입하거나 전화, 알림 등에 의해 앱을 사용할 수 없게 되는 경우 이 상태로 진입합니다.

Active

앱이 실제 실행 중이고, 사용자 event를 받아서 상호작용이 가능한 상태입니다.

Background

홈 화면으로 나가거나, 다른 앱으로 전환되어 현재 앱이 실질적으로 동작을 하지 않는 상태입니다.
예를 들어 음악앱을 닫아도 재생한 음악이 계속 실행되는 경우, 사용자가 앱을 사용하지 않는 동안 서버와 데이터를 동기화하거나 타이머가 실행되어야 하는 등의 작업을 이 상태에서 할 수 있습니다.

Suspended

앱을 다시 실행했을 때, 최근 작업을 빠르게 로드하기 위해 메모리에 관련 데이터만 저장되어있는 상태입니다.
앱이 백그라운드 상태에 진입했을 때 다른 작업을 하지 않으면 Suspended 상태로 진입합니다.
Suspended 상태의 앱은 메모리가 부족해지면, 가장 먼저 메모리에서 해제됩니다.

profile
iOS앱 개발자가 될테야
post-custom-banner

0개의 댓글