티스토리 뷰
AppDelegate / SceneDelegate과 관련된 면접 질문
- SceneDelegate에 대해 설명하시오. 출처
- 상태 변화에 따라 다른 동작을 처리하기 위한 AppDelegate methods를 설명하시오. 출처
- 상태 변화에 따라 다른 동작은 iOS13 이후부터 SceneDelegate의 역할이 되었음
iOS 12 이하 버전의 AppDelegate
Application은 1개의 process 와 1개의 user interface 인스턴스 를 가졌다.
AppDelegate은 2가지 역할을 했는데, application에게
- process level의 이벤트 발생을 알려주었고
- UI의 상태변화를 알려주었다.
process level의 이벤트의 예시로는 application이 launch 되고 있는지 또는 terminate 되기 직전 등이 있고,
UI의 상태변화는 willEnterForeground, willResignActive와 같은 메소드들을 통해 알릴 수 있었다.
iOS 13 이후 버전의 AppDelegate
그러나 iOS 13으로 넘어오면서 1 process & multiple user interface(= scene sessions) 를 지원하게 되었다.
실제로 plist의 Application Scene Manifest를 보면 기존에는 없던 Enable Multiple Windows가 포함되어 있다.
기존에는 AppDelegate에서 UIWindow 객체에 대한 configuration도 진행했었는데 이제는 하나의 window 객체만 관리하지 못한다.
AppDelegate의 일부 역할을 SceneDelegate에게 넘겨주었고, AppDelegate은 새로운 역할을 하나 더 맡게 되었다.
- process level의 이벤트 발생을 알려주고 (그대로)
- session life-cycle을 application에게 알려주게 되었다. (신규)
기존의 UI 상태 변화를 알려주는 것은 SceneDelegate이 책임지게 되었고 AppDelegate은 새로운 Scene Session이 생성되거나 버려질 때 알리는 역할을 새로 맡게 되었다.
SceneDelegate
UI의 상태변화를 메소드들을 통해 application에게 알리는 역할을 한다. 기존 AppDelegate들이 갖고 있던 메소드들과 거의 1:1 mapping이 가능하다.
SceneDelegate은 아래의 메소드를 갖고 있다.
scene(_: willConnectTo: options:)
sceneWillEnterForeground(_ :)
sceneDidBecomeActive(_ :)
sceneWillResignActive(_ :)
sceneDidEnterBackground(_ :)
sceneDidDisconnect(_ :)
실제 call stack 따라가보기
- AppDelegate: didFinishLaunching → UI와 무관한 일회성 setup을 이곳에서 해도 무방하다
- system이 scene session을 생성했다. (UI Scene 아님)
- AppDelegate: UISceneConfiguration
- SceneDelegate: scene willConnectTo
User가 Home 화면으로 돌아갔다
- SceneDelegate: willResignActive
- SceneDelegate: didEnterBackground
- SceneDelegate: didDisconnect
didDisconnect 살펴보기
system은 한정 된 자원을 가지고 있기 때문에 자원을 언젠가는 회수를 해야 한다. 따라서 scene이 background에 들어간 후 어느 시점에 scene을 memory로부터 해제시킨다. 즉,
- scene delegate이 메모리에서 해제됨
- scene delegate이 관리하던 window 및 view 계층 메모리에서 해제됨
따라서 didDisconnect코드 내부에서는 scene과 관련된 불필요한 자원을 돌려주는 작업을 해주면 된다. 가령 디스크나 네트워크를 통해 쉽게 데이터를 다시 불러올 수 있다거나
재생성이 쉬운 데이터는 돌려주는게 좋지만 scene이 다시 reconnect 될 수 있으므로 사용자의 input과 같이 재생성이 어려운 데이터는 가지고 있어야 하니 데이터를 무조건적으로 영구삭제하면 안된다.
User가 app switcher틑 통해 app 종료
- AppDelegate: didDiscardSceneSessions → 이 곳에서 user data, state 등 scene과 관련된 모든 데이터를 지우는 작업을 해주면 된다.
Reference
'iOS' 카테고리의 다른 글
[iOS] UICollectionView로 무한히 도는 Carousel 만들기 (Infinite Carousel) (4) | 2021.03.24 |
---|---|
[iOS] ViewController 안에 Static cell을 가진 TableView를 쓰고 싶을 때 (0) | 2021.01.27 |
[iOS] SceneDelegate & AppDelegate의 역할 (0) | 2021.01.16 |
[Swift] defer 구문 (0) | 2021.01.16 |
[Swift] Optional (0) | 2021.01.12 |
- Total
- Today
- Yesterday
- 삼성
- 부캠
- 커넥트재단
- ios
- 컴공졸작
- C++
- RxSwift
- TableView
- 운영체제
- 컴과졸작
- 알고리즘
- 소프트웨어아카데미
- OS
- firebase
- 부스트캠프2020
- 데이터분석
- 소프트웨어역량시험
- 개발자인턴
- SWIFT
- 보안
- 코딩테스트
- 삼성소프트웨어아카데미
- 프로그래머스
- 코테
- nosql
- 컴퓨터공학
- swacademy
- 부스트캠프
- 인턴
- 졸업작품
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |