오늘은 https://github.com/JeaSungLEE/iOSInterviewquestions 관련 포스팅 두 번째 시간이다. 공부하면서 느낀 점은 처음 보거나 낯선 용어들이 많지만, 찾아보면 다 이해가 되고 겉핥기 식으로 알고 있는 내용들도 있어서 신기했다. 바로 시작해보겠다!
앱이 시작할 때 main.c에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
앱 실행 과정(object-c)
1. 앱이 시작되면서 main() 함수가 실행
2. main() 함수는 UIApplcationMain() 함수를 실행
3. UIApplicationMain() 함수는 UIApplication 객체(앱의 본체)를 생성
4. UIApplication 객체는 info.plist 파일로부터 앱 구성에 필요한 정보를 로드
5. AppDelegate 객체 생성 후 UIApplication 객체와 연결
6. 이벤트 루프 및 초기설정 진행
- swift 에서는 main 함수가 없으나, @main (어노테이션)이 이 역할을 대체한다. 이것을 통해 1~5의 과정을 대체한다.
UIApplcationMain 함수는 UIApplication 객체를 반환 !
- UIApplication은 앱의 본체라 할 수 있는 객체. --> 사실상 앱 자체를 의미
- 이 객체를 통해 개발자는 앱 실행에 부분적으로 관여할 수 있음
- UIApplication은 싱글톤 형태(찾아봐야 함), UIApplication.shared의 형태로 앱 전역에서 사용 가능.
- 사용자의 이벤트에 반응하여 앱의 초기설정을 하는 역할(라우팅, 핸들링)
앱 실행 과정을 마저 적어본다면..
7. 앱 실행 완료 직전, AppDelegate 클래스의 application(_: didFinishedLaunchingWithOptions:) 메소드 호출
8. 실행
https://limjs-dev.tistory.com/58
@Main에 대해서 설명하라.
(설명하기 전에, Xcode 12부터 @UIApplicationMain --> @main으로 변경 되었다.)
@main은 범용적인 엔트리 포인트이다.
@main 이전의 @UIApplicationMain은
- UIApplication 객체 생성
- 앱의 Life-Cycle 관리
- UIApplicationMain 함수 호출 --> 이 함수는 App의 핵심 객체 구현과 App 구동 플로우에서 중요한 역할을 함.
@main을 사용하게 된 이유
- 자유롭게 Entry Point 지정 가능하게 함. --> 단일 파일이던, 프레임워크 프로젝트던, 커스텀 라이브러리던 상관 없이 엔트리 포인트를 지정할 수 있음.
아직 많이 어려운 부분.
https://woozzang.tistory.com/52
https://seungchan.tistory.com/79
앱이 foreground에 있을 때와, background에 있을 때 어떤 제약사항이 있는가 ?
- foreground : 앱을 사용자가 보고 있는 화면 --> 시스템 자원의 우선 순위가 높은 상태
- background : 앱이 홈 화면에 들어가 보여지지 않는 상태 --> 뒤에서 실행되고 있는 상태
foreground는 InActive와 Active상태로 나뉘는데, InActive는 foreground 상태에서 전화가 오거나, 잠금을 걸거나, 멀티태스킹 스크린에서는 InActive이고, 그 외에는 Active이다.
foreground 에서는 메모리 및 기타 시스템 자원에 대해 background보다 높은 우선순위를 가지고 있고, 시스템은 이러한 리소스를 활용할 수 있도록 필요에 따라 background 앱을 종료한다.
background 에서는 가능한 적은 메모리 공간을 활용해야 하고, 사용자 이벤트를 받기 어렵고, 이미지 객체 참조 등에 대한 메모리가 제한된다는 특징이 있다.
그러나
- AirPlay, Picture to Picture 비디오를 통한 오디오 통신
- 사용자 위치 서비스
- 외부 악세서리와 통신
- 블루투스 LE(Low Energy)와 통신, 혹은 디바이스를 블루투스 LE 악세사리로 변환
- 서버에서의 정기적인 업데이트
- Apple Push Notification 지원
위와 같은 경우에는 background 앱에 실행 시간을 할당시켜준다고 한다.
https://github.com/lunchScreen/Interview_Questions/issues/42
상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드를 설명하라.
메소드
func application(UIApplication, willFinishLaunchingWithOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool
- 앱 실행 후 유저 화면에 보이기 직전에 호출됨.
func applicationDidBecomeActive(UIApplication)
- 앱이 Active 상태로 전환된 직후에 호출됨.
func applicationWillResignActive(UIApplication)
- 앱이 포커스를 잃을 경우 호출됨(ex : 홈버튼).
func applicationDidEnterBackground(UIApplication)
- 앱이 백그라운드로 진입할 때 호출됨.
func applicationWillEnterForeground(UIApplication)
- 앱이 포어그라운드로 진입할 때 호출됨.
https://sozohoy.tistory.com/16
오늘은 여기까지. 어디서 본 것들이고 정리하다보니 하나 둘 씩 알아가는 것 같아서 뿌듯하다 😁
'iOS & Swift' 카테고리의 다른 글
[iOS] iOS 인터뷰 질문 - 3 (0) | 2022.07.08 |
---|---|
[iOS] SceneDelegate란 ? (0) | 2022.05.23 |
[iOS] iOS 인터뷰 질문 - 1 (0) | 2022.05.11 |
[Swift] 타입 캐스팅이란 ? (is, as) (0) | 2022.05.11 |
[iOS] swift Alamofire 토큰 재발급 구현 방법(adapt, retry, RequestIntercepter) (0) | 2022.04.25 |