본문 바로가기

면접 질문

3주차 질문지

AppDelegate와 SceneDelegate 에 대해 설명하시오.

앱의 시작 준비

앱이 처음 실행될 때, AppDelegate는 앱의 기본 데이터와 설정을 초기화(앱을 사용할 준비)

AppDelegate에서 앱이 시작되어 Scene을 관리하고

SceneDelegate에서 화면에 관련된 Life Cycle을 관리한다.

 

Scene Delegate의 Life Cycle에 대해서 설명해주세요.

Unattached 에서 사용자가 요청한 Scene이 foreground로 빠르게 이동하여 보여짐

Foreground Active로 바로 가는게 아닌 Foreground Inactive -> Foreground active순서로 보여짐

시스템이 요청한 Scene은 일반적으로 이벤트를 처리할 수 있도록 백그라운드로 이동

사용자가 앱의 UI를 닫으면 UIKit에 연결된 Scene을 백그라운드 상태로 이동시키고 결국 Suspended(중지)상태로 전환

UIKit은 언제든 백그라운드, 일시중지 상태의 Scene의 연결을 해제하여 리소스를 회수하고 연결되지 않은 상태로 변경이 가능하다.

 

iOS 메모리구조에 대해서 설명해주세요.

앱을 실행하면 운영체제(iOS)가 메모리(램)에 영역을 설정함

메모리 안에는 크게 4가지 영역이 존재

 

스택(함수 호출 관련 데이터), 힙(ARC 관련), 데이터, 코드 존재

DATA, CODE 영역은 크기가 정해져 있지만 HEAP, STACK은 정확한 크기가 정해져있지 않다.

 

 

ARC에 대해서 설명해주세요.

Automatic Reference Counting의 약자로 말그대로 자동으로 인스턴스가 현재 참조되고 있는 횟수(Reference Count)를 '숫자로' 카운팅하여 0이될때 힙(Heap) 메모리에서 해제해주는 메모리 관리 방식이다.

 

ARC의 동작방식에 대해서 설명해주세요.

클래스의 새로운 인스턴스를 생성할 때마다 ARC는 해당 인스턴스에 대한 정보를 저장한 메모리 공간을 할당한다.

해당 메모리 공간에 인스턴스의 타입, 연관된 프로퍼티의 값들을 저장

해당 인스턴스가 더이상 필요하지 않게 되면 ARC는 인스턴스가 사용했던 메모리를 해제(만약 ARC가 아직 사요중인 인스턴스를 해제하고, 해당 인스턴스에 접근하면 앱이 크래시 날 확률이 높다.

ARC는 사용중인 인스턴스가 메모리에서 해제되지 않게 현재 몇개의 프로퍼티, 상수, 변수들이 인스턴스를 참조하고 있는지 추적한다.

  • 참조를 시작하면 카운팅 + 1
  • 참조를 종료하면 카운팅 - 1
  • 최종적으로 0이되면 메모리에서 삭제

 

Memory Leak에 대해서 설명해주세요.

메모리 누수

사용이 종료된 인스턴스가 메모리에서 해제되지 않고 남아있는 현상

사용하지 않아도 될 메모리 공간이 사용되고 있는 현상

 

강한순환참조에 대해서 설명해주세요.

강한 참조로 서로를 참조하는 것을 강한 순환 참조라고 한다.

 

강한순환참조는 언제 발생하는지 예시를 하나 들어주세요.

두 인스턴스를 생성하고 각각 강한참조로 참조하고 있을 때

 

메모리릭을 방지하기 위해서 참조하는 방법을 설명해주세요.

참조카운트를 올리지 않으면 강한순환참조에 빠지지 않는다

참조카운트를 올리지 않기 위해 strong이 아닌 weak, unowned를 사용한다.

 

weak, unowned에 대해서 설명해주세요.

참조 사이클을 방지하기 위해 Swift에서 사용하는 두가지 방식인데

weak 약한참조는 참조하는 객체의 강한 참조 횟수를 증가시키지 않으며, 참조 대상 객체가 메모리에서 해제될 때 자동으로 nil로 설정된다.

unowned 비소유참조는 weak와 비슷하게 강한참조횟수를 증가시키지 않지만, 참조 대상이 메모리에서 해제되어도 nil로 설정되지 않는다. 이는 참조대상이 해제되지 않을 것이라는 보장이 있을 때 사용한다.

 

특징 weak unowned
참조 대상 해제 시 자동으로 nil 설정 nil로 설정되지 않음, 충돌 발생 가능
옵셔널 여부 옵셔널 (nil 허용) 비옵셔널 (nil 허용하지 않음)
참조 대상 수명 참조 대상이 해제될 수 있는 경우 참조 대상이 해제되지 않을 것이 보장된 경우
참조 횟수 증가 증가하지 않음 증가하지 않음
사용 예시 델리게이트 패턴, UI 요소 객체가 자기보다 오래 살아남을 때

 

 

GCD를 사용하여 background thread에서 UI를 업데이트 하면 어떤일이 발생하나요?

UI 업데이트는 반드시 메인스레드에서 이루어져야 하고 백그라운드 스레드에서 업데ㅣ트하려고 하면

UI가 제대로 업데이트되지 않거나, 화면이 깜빡이는 등의 문제가 발생할 수 있다.

심각한 경우 앱 크래시로 앱이 비정상 종료될 수 있다.

 

GCD에서 Serial Queue, Concurrent Queue 의 차이점에 대해서 설명해주세요.

Serial Queue  직렬 큐는 한번에 하나의 작업만 실행한다. 작업이 추가된 순서대로 실행되며, 이전 작업이 완료된 후에 다음 작업이 시작된다. - 파일 읽기/쓰기 등 순서가 중요한 작업

Concurrent Queue 동시 큐는 여러작업을 동시에 실행할 수 있다. 작업이 추가된 순서대로 시작되지만, 완료 순서는 보장되지 않는다. - 이미지 처리, 네트워킹 등 병렬 처리가 가능한 작업

 

GCD에서 sync와 async에 대해서 설명해주세요.

sync와 async는 작업을 큐에 제출할 때 현재 스레드의 동작 방식을 결정한다.

sync(동기식 메서드): 작업을 현재 큐에 제출하고, 작업이 완료될 때까지 현재스레드를 블로킹한다. 작업이 끝난 후에야 다음 코드를 실행한다. 작업의 순차적인 실행이 필요할 때 사용

async(비동기식 메서드): 작업을 현재 큐에 제출하고, 즉시 반환하여 현재 스레드는 다음 코드를 실행한다. 작업은 백그라운드에서 실행된다. 현재 스레드는 작업완료를 기다리지 않으므로 논블로킹 호출이다. 작업의 완료 시점과 관계없이 다음 코드가 실행된다.

sync는 작업의 결과가 즉시 필요하며, 해당 작업이 완료된 후에 다음 로직을 실행해야 할 때 사용한다.

async는 작업을 백그라운드에서 실행하고, 현재 스레드는 계속해서 다음 작업을 수행해야 할 때 사용한다.

'면접 질문' 카테고리의 다른 글

모의면접 후  (1) 2024.09.05
8월 3주 모의면접 질문지  (0) 2024.08.14