[iOS/Swift] 신입 면접 질문 정리 (22.05.04 업데이트)
ㅎㅎ 내가 보려고 만드는 면접질문 정리~
직접 들은 질문들 + 유명한 iOS 면접 질문들 섞어서 정리해봅니다!
1. ARC (Automatic Reference Counting)
자동 레퍼런스 카운팅! 자동으로 메모리를 관리해주는 방식
ARC는 메모리영역중 힙 영역을 관리함.
런타임에 주기적으로 참조를 추적하여 사용하지 않는 인스턴스를 해제하는 GC(garbage collector)와 다르게 컴파일 타임 시점에 언제 참조/해제되는지 결정되어 런타임때 그대로 실행됨.
근데... 순환참조시 메모리가 영구적으로 해제되지 않을 수 있음
모든 인스턴스는 자신의 RC값을 가지고있음
(몇번이나 참조되고있는지!! 참조 횟수!! 인스턴스 생성될때 힙에 같이 저장됨)
이 RC값은 어떻게 세냐??
참조 횟수가 +1이 되는 순간은 인스턴스의 주소값을 변수에 할당할때!
1) 인스턴스 새로 생성
2) 기존 인스턴스 다른 변수에 대입할때
참조 횟수가 -1이 되는 순간은
1) 인스턴스 가리키던 변수가 메모리에서 해제되었을때!!
2) nil이 지정되었을때?(해제나 마찬가지인가..)
3) 다른거 지정되었을때(당연..)
2. 메모리(코드,데이터,힙,스택)
코드 영역
- 소스코드가 기계어 형태로 저장됨. 중간에 코드 변경되지 않도록 read-only
데이터 영역
- 전역변수, static 변수가 저장됨. 프로그램 시작과 동시에 할당되고, 종료되면 메모리 해제 됨. 실행 도중 변수 값 변경될 수 있어서 read-write로
힙 영역 -수동
- 프로그래머가 할당/해제하는 메모리 영역. malloc, calloc로 힙에 메모리를 할당(동적할당).그래서 사용하고 난 후에는 메모리 해제를 해줘야댐!! 안그러면 memory leak 발생.
- 유일하게 런타임 시에 결정됨!!! 데이터의 크기가 확실하지 않을때 사용.
- 프로그램의 모든 함수에서 액세스 할수있음!
- 다만 할당/해제작업 → 속도 저하
- 힙 경합(두개 이상 쓰레드가 동시접근하면 락걸림) → 속도 저하
- swift 에서 클래스 인스턴스, 클로저같은 “참조타입"의 값!!!은 모두 힙에 자동할당됨 → 메모리해제는????
- 더이상 참조되지 안흐면 ARC가 자동으로 해제~~!
스택 영역 -자동
- 함수 호출시! - 지역변수, 매개변수, 리턴값 등등 저장됨
- 함수 종료되면 저장된 메모리도 해제!!(반환)
- 빠름. 힙보다
- 컴파일타임에 결정되기 때문에 무한히 할당할수는 x → 너무 큰 메모리는 할당 안됨!! 너무 많은 메모리 할당하면 stack overflow 뜸
- 스레드로부터 안전함
- 프로그램이 자동으로 사용하는 임시 메모리영역. LIFO 속도 빠름. 지역변수만 액세스 할수있음.
힙과 스택은 같은 메모리 영역 공유
힙은 0x0000000→ 시작
스택은 0xfffffff→시작
3. 참조(Strong, Weak, Unowned + 순환참조)
강한참조? Strong
인스턴스의 주소값이 변수에 할당될 때, RC가 증가한다면? 강한참조
인스턴스 생성, 사용했던거 다 strong~
default 값이 strong임.
순환참조?
두개의 객체가 서로서로 참조하고 있는 형태
서로가 서로를 참조하고있어서 RC가 0이 되지 못함. 근데 인스턴스를 둘다 해제해버리면 인스턴스에 접근할수있는 방법도 없어서 메모리 해제도 못함.
이를 해결하기 위해서는??? → weak 약한 참조!
약한 참조? Weak
인스턴스 참조할때, RC를 증가시키지 않음!!! 엥?
참조하던 인스턴스가 메모리에서 해제된 경우 자동으로 nil이 할당돼서 메모리 해제됨.
순환참조되어있던 둘 중 한쪽을 weak로 선언해줌. (무조건 !옵셔널타입)
근데 !!! 둘 중에 수명이 더 짧은 인스턴스를 가리키는애!!!<를 약한 참조로 선언. ( 수명이 더 긴쪽에서 선언 )
ex) 철수/영희 중에 철수 인스턴스가 먼저 죽는다
→ 그럼 영희의 boyfriend가 Nil이 될 수 있다
→ 영희의 boyfriend를 weak로 선언!!!
weak의 특징! 가리키던 인스턴스가 메모리에서 해제되면 nil이 할당된다.(strong은?이럴일이없을듯? 가리키는 인스턴스가있으면 RC가 0이되지 않으니까?)
클로저 내부에서 [weak self] 해주는것도 순환참조 문제때문!
unowned 미소유 참조?
weak랑 비슷함!! RC값을 증가시키지 않아 강한순환참조를 해결
근데? unowned는 인스턴스 참조하는 도중 메모리에서 사라질 일이 없다고 확신. (그래서 수명이 더 짧은 쪽에서 선언)
⇒ 뭐지?아직 좀 헷갈린다 왜 쓰는거지... 이제 옵셔널도 가능함! Weak는 무조건 옵셔널이어야 해서 옵셔널 값이 아닐때 쓰나?
weak보다 에러날 확률이 높아보이는데..
4. SceneDelegate 와 AppDelegate
✅ iOS 13 기점으로 변한점!
- 이전까지는 하나의 앱에 하나의 window였지만 window 의 개념이 Scene으로 대체 됨. 하나의 앱에서 여러개의 Scene을 가질 수 있게 됨.
- Scene Delegate가 생김!! -> 이 SceneDelegate가 원래 AppDelegate가 가지고있던 UI LifeCycle 가져감~
- AppDelegate에 Session Lifecycle에 대한 역할이 추가됨!!
그래서 Scene이 뭐지?
기존 앱은 window하나밖에 가지지 못했으나 멀티 뷰가 가능해지면서 Scene으로 바뀜!
app switcher를 통해 여러 scene을 확인할 수 있음.
scene에는 UI 하나의 인스턴스를 나타내는 windows와 view controllers가 들어있음.
각각의 Scene은 UIWindowSeceneDelegate를 가지고있음 ! -> 이걸로 UIKit과 app사이에서 인터랙션 함
하나의 앱은 여러 Scene과 SceneDelegate객체를 동시에 활성화 할 수 있음.
Scene들은 같은 메모리와 앱 프로세스 공간을 공유하면서 동시에 실행 됨.
Scene Session 은 또 뭐지?
유저나 개발자가 새로운 Scene을 만들었을때, 해당 Scene을 tracking 하기 위해 Session 객체를 생성함.
위에서 AppDelegate에 Session Lifecycle에 대한 역할이 추가 됐다고 했는데, 그게 그림에서 보이는 두가지 메소드다.
SceneSession이 생성될 때와 삭제 될 때, AppDelegate에 알려주는 메소드가 추가 됨!!
5. Class 와 Struct 의 차이
Class
- 참조 타입!! → 같은 클래스 인스턴스를 여러 변수에 할당하고 값을 변경시키면 모든 변수에 영향을 줌
- ARC로 메모리 관리
- deinit으로 클래스 인스턴스의 메모리 할당해제 가능
Struct
- 값 타입
- 구조체 변수 새롭게 할당할때마다 새로운 구조체가 할당됨