기술면접 01

DaY·2021년 4월 27일
1

기술면접

목록 보기
1/6
post-thumbnail

Reference

App Life Cycle

iOS에서 앱은 간단하게 3가지 실행 모드와 5 가지의 상태로 구분이 가능하며 항상 하나의 상태를 가지고 있다.

Not Running
실행되지 않는 모드와 상태 모두 의미

Foreground

  • Active
  • Inactive

Background

  • Running
  • Suspend

Not Running >> Active

  • 앱을 터치해서 실행이 되는 상태

Active >> Inactive << Running

  • 앱을 활성화 상태에서 비활성화 상태로 만든 뒤, 백그라운드에서도 계속 실행중인 상태

Active >> Inactive >> Suspend

  • 앱을 활성화 상태에서 비활성화 상태로 만든 뒤, 백그라운드에서도 정지되어 있는 상태

Running >> Active

  • 백그라운드에서 실행중인 앱을 다시 포어그라운드에서 활성화되는 상태

View Life Cycle

앱은 하나 이상의 뷰로 구성되어 있으며, 각각의 뷰들은 라이프 사이클을 가지고 있다. 따라서 뷰의 라이프 사이클을 고려해서 로직을 넣고 구성해야 한다.

ViewDidLoad
뷰 컨트롤러 클래스가 생성될 때, 가장 먼저 실행
특별한 경우가 아니라면 딱 한 번 실행되어 초기화할 때 사용

ViewWillAppear
뷰가 생성되기 직전에 항상 실행이 되기 때문에 뷰가 나타나기 전에 실행해야 하는 작업을 구현

ViewDidAppear
뷰가 생성되고 난 뒤에 실행
데이터를 받아서 화면에 나타내거나 애니메이션 등의 작업을 하는 로직 위치
ViewWillAppear에 로직을 넣었다가 뷰에 반영이 안되는 경우가 있기 때문

ViewWillDisappear
뷰가 사라지기 직전에 실행

ViewDidDisappear
뷰가 사라지고 난 뒤에 실행

Delegate vs Block vs Notification

Delegate

  • 객체 간 데이터 통신을 할 경우 전달자 역할
  • 이벤트 처리할 때 많이 사용하게 되는데 특정 객체에서 발생한 이벤트를 다른 객체에게 통보할 수 있도록 해준다.
  • 여러 이벤트가 있거나 클래스가 delegate로부터 데이터를 가져와야 할 때 사용 (ex UITableView)

Block

  • 이벤트가 하나일 경우

Delegate와 Block은 이벤트에 대해 하나의 리스너가 있을 때 사용하는 것이 좋으며 재사용하는 경우에는 클래스 기반의 delegate를 사용하는 것이 좋다.

Notification

  • 이벤트에 대해 여러 리스너가 있을 때 사용

    UI가 특정 이벤트 기반으로 정보를 표시하는 방법을 notification으로 브로드캐스팅하여 변경하거나 문서 창을 닫을 때 문서의 객체가 상태를 저장하는 지 확인하는 방법으로 notification을 사용할 수 있다.

  • notification의 일반적인 목적은 다른 객체에 이벤트를 알리면 적절하게 응답하는 것이다. 그러나 noti를 받는 객체는 이벤트가 발생한 후에만 반응할 수 있다.

Memory Management

Swift는 ARC로 메모리 관리를 한다.

ARC

  • 자동 참조 계수 (ARC; Automatic Reference Counting)
  • 인스턴스가 더 이상 필요없을 때 사용된 메모리를 자동으로 해제

강한 순환 참조

  • 강한 순환 참조는 ARC로 메모리를 관리할 때 발생할 수 있는 문제
  • 두 개의 객체가 서로 강한 참조를 하는 경우 발생

강한 순환 참조 해결법

  • 서로 강한 참조를 하는 경우 발생한다면, 둘 중 하나의 강한 참조 변경
  • 강한 참조를 약한(weak) 참조 혹은 미소유(unowned)참조로 변경하면 강한 순환 참조 문제를 해결할 수 있다.
  • 약한 참조는 옵셔널일 때 사용하고, 미소유 참조는 옵셔널이 아닐 때 사용한다.

Assign vs Weak

assign

  • 객체의 retain count를 증가시키지 않는다.
  • 외부에서 retain count를 감소시켜 객체가 소멸될 수 있기 때문에 int와 같은 primitive type에 적합

weak

  • assign과 거의 동일하지만 assign은 객체가 소멸되어도 포인터 값이 변하지 않는다.
  • weak는 객체가 해제되는 시점에 포인터 값이 nil로 변경
  • assign의 문제점을 객체가 해제되어도 포인터 값이 남아있어 접근하려다 오류가 생긴다는 점이다.

Frame vs Bounds

Frame
부모 뷰의 상태적인 위치(x, y) 및 크기(너비, 높이)로 표현되는 사각형

Bounds
자체 좌표계 (0,0)을 기준으로 위치 (x, y) 및 크기(너비, 높이)로 표현되는 사각형

ETC

Dynamic Binding

동적 바인딩은 컴파일 타임이 아닌 런타임에 메시지 메소드 연결을 이동시킨다.
그래서 이 기능을 사용하면 응답하지 않을 수 있는 객체로 메시지를 보낼 수 있다.
개발에 유연성을 주지만 런타임에는 충동을 발생시킬 수 있다.

데이터 저장 방법

  • Server / Cloud
  • Property List
  • Archive
  • SQLite
  • CoreData

_ 와 . 연산자로 접근하는 것의 차이점
_ 는 인스턴스 변수에 직접 접근하는 연산자
. 는 getter 메소드 호출을 간단하게 표현한 것

0개의 댓글