본문 바로가기
2023년 이전/iOS

UIApplication, Main Run Loop, AppDelegate

by JeongUPark 2020. 6. 28.
반응형

iOS에 setNeedsLayout 과 layoutIfNeeded 에 대해서 알아보니, 우선 iOS의 Main Run Loop에 대해 알아야 해서 이 부분에 대해서 먼저 알아보았습니다.

 

main 함수는 어딨지?

우선 iOS는 Object-C 기반이기 때문에 C 언어 처럼 main에서 시작이 된다고 합니다. 하지만 이 main은 iOS의 핵심 라이브러리인 UIKit framework에서 관리하기 때문에 개발자들이 직접 이 main함수를 사용할 일은 없습니다.

 

UIApplication 

UIKit framework main 함수를 다루는 과정에서 UIApplicationMain 함수를 실행하고,  이 함수를 통해 UIApplication 객체가 생성이 되는데 이 객체를 통해서 앱의 실행에 대해 부분적으로 관여할 수 있습니다.  UIApplication 객체는 싱글턴 형태 UIApplication.shared 형태로 앱 전역에서 접근이 가능하게 만들어졌습니다.
UIApplication 의 대표적 역할은 유저의 이벤트에 반응하여 앱의 초기설정을 하는 것 입니다. 예를 들면 앱이 Background에 진입한 상태에서 추가적인 작업을 할 수 있도록 만들어주거나, 푸시알람을 받았을 때 어떤 방식으로 이를 처리할지 등에 대한 것을 다룹니다.

Main Loop Run

UIApplication 객체는 앱이 실행될때,이벤트가 처리될 때, 뷰 기반의 인터페이스에서 업데이트가 발생할 때 setup됩니다. 그리고 Main Run Loop를 실행합니다. 그리고 이 Main Run Loop는 앱의 Main Thread에서 실행됩니다.

Main Run Loop 라는 것은 유저가 이벤트를 일으키는 이벤트들을 춘처적으로 처리하는 프로세스입니다.  UIApplication은 Main Run Loop 를 View 와 관련된 이벤트 View 의 업데이트에 활용합니다. 

iOS apps에서의 공통 이벤트들.

  • Touch

  • Remote control & Shake motion events

  • Accelerometer & Magnetometer & Gyroscope

  • Location

  • Redraw

이벤트 처리 과정

유저가 발생시키는 이벤트의 처리 과정을 다음과 같은 순서로 정리할 수 있습니다.

  1. 유저가 이벤트를 일으킨다.(터치, 줌인 등)

  2. 시스템을 통해 이벤트가 생성된다.

  3. UIKit 프레임워크를 통해 생성된 port로 해당 이벤트가 앱으로 전달된다.

  4. 이벤트는 앱 내부적으로 Queue의 형태로 정리되고, Main Run Loop에 하나씩 매핑된다.

  5. UIApplication 객체는 이때 가장 먼저 이벤트를 받는 객체로 어떤 것이 실행되야 하는지 결정한다

앱의 상태 변화

애플에서 정의하는 앱의 상태변화는 다음 5가지로 구분 됩니다.

 

  • Not running - 앱이 실행되지 않았거나, 실행중일때 하지만 시스템에 의해서 종료된상태.

  • Inactive - 앱이 foreground상태에 들어갔지만 어떠한 이벤트도 받지 않는다. 앱이 다른 앱으로 상태 전환이 들어 갈때 잠시 머무는 상태

  • Active - foreground앱의 평범한 상태(일반적으로 앱이 돌아가는 상태),   이벤트들을 받는다.

  • Background - 앱이 Suspended 상태로 진입 하기전 거치는 상태. 앱의 사용이 잠시 일시적으로 중단될때 이상태에 돌입한다. 하지만 추가적으로 실행시간이 요구되는 앱이 실행될때 이상태에 머물기도한다. 추가적으로 앱이 직접 background로 실행될땐, Inactive상태가 아니라 바로 이상태로 머문다.

  • Suspended - 백그라운드 상태지만 코드는 실행되지 않는다. 시스템은 자동적으로 앱을 이상태로 바꾼다. 이상태일때는 메모리에 앱이 남지만 어떠한 코드도 실행되지않는다. 하지만 메모리가 부족하면 알림없이 메모리공간을 차지하기위해 이상태인 앱을 메모리에서 제거한다. 그래서 오랜시간 켜지않은 앱을 다시 불러오면 처음부터 시작되는 이유이다.

 

AppDelegate

AppDelegate 는 앱의 각각 상태에 접근을 할 수 있도록 설계되었습니다. iOS 앱 프로젝트를 생성할때에 자동적으로 AppDelegate.swift 파일이 생기며 그 안에는 AppDelegate라는 클래스와 앱의 상태에 대응 할 수 있는 함수들이 들어있습니다.

AppDelegate객체는 UIResponder, UIApplicationDelegate 를 상속 및 참조하고 있습니다.

UIResponder 는 앱에서 발생하는 이벤트들을 담고 있는 추상형 인터페이스 객체로 View와 사용자의 이벤트간의 연결을 관리하는 역할을 합니다.

UIApplicationDelegate는 다음과 같은 함수를 가지고 있습니다.

  • application:willFinishLanunchingWithOptions: 앱 실행시 가장 먼저 실행되는 함수

  • application:didFinishLaunchingWithOptions: 앱이 사용자에게 표시되기 전 최종 초기화를 수행 할 수 있는 함수

  • applicationDidBecomeActive: 앱이 포어 그라운드 앱이 되기전 실행 함수

  • applicationWillResignActive: 앱이 포어그라운드에서 벗어나고 있을때 호출되는 함수, 이 함수를 사용하여 앱을 정지상태로 만들 수 있다.

  • applicationDidEnterBackground: 앱이 백그라운드에서 실행중일때 실행 함수. 언제든지 앱이 일시 중지될 수 있다.

  • applicationWillEnterForeground: 앱이 백그라운드에서 벗어나 포어그라운드로 돌아왔을때 실행 함수. 앱은 아직 활 성화 되지 않음

  • applicationWillTerminate: 앱이 종료중일때 실행함수(일시정지 아님)

 

 

출처 : https://wi0214.tistory.com/4

 

[Swift] iOS App Life Cycle - UIApplication, Main Run Loop, AppDelegate 알아보자

 안녕하세요 치캣입니다. App Life Cycle을 언제 한번 정리해야지 하다 공부용으로 정리해보았습니다. iOS에서는 main Function을 쓰지 않을까?  C언어 기반의 함수들은 main이라는 함수가 앱의 시작이 ��

wi0214.tistory.com

https://llldddjjj.tistory.com/entry/iOS-iOS-%EC%95%B1%EC%9D%84-%EA%B5%AC%EC%84%B1%ED%95%98%EB%8A%94-%ED%95%B5%EC%8B%AC-%EA%B0%9D%EC%B2%B4%EB%93%A4%EA%B3%BC-iOS-%EB%A9%94%EC%9D%B8-%EB%9F%B0%EB%A3%A8%ED%94%84-%EB%8F%99%EC%9E%91-%EC%9D%B4%ED%95%B4

 

[iOS]# iOS 앱을 구성하는 핵심 객체들과 iOS 메인 런루프 동작 이해

iOS 앱을 구성하는 핵심 객체들과 iOS 메인 런루프 동작 이해 출처 : App Programming Guide for iOS 위의 문서는 이런식으로 시작한다. "당신의 앱이 Xcode에서 잘돌아간다고 AppStore에 들어갈 수 있는건 아니

llldddjjj.tistory.com

 

반응형