iOSInterviewquestions - iOS
목적 : 배울때는 잘했는데, 나이가 먹으니까 자꾸 까먹어서 아래 깃허브 글을 바탕으로 꾸준히 이론 공부를 하고자 함. 물론 설명은 내가 잘 아는게 목적이라 철저히 나를 이해시킬 수 있는 나의 언어로 작성.
작성일 : 2022년 4월 06일
- README: 추후에 수정이 있을 경우 아래에 날짜와 시각을 작성하고, 수정 내용을 간략히 정리해주세요.
예시)
(수정) oooo년 oo월 oo일 oo시 oo분
- 변경내용 : xxx에 대한 자료를 보강
✅ 공부의 기준이 되는 깃허브 글
https://github.com/JeaSungLEE/iOSInterviewquestions
✅ iOS
- Bounds 와 Frame 의 차이점을 설명하시오.
- frame은 superview의 좌표 시스템에서 뷰의 위치와 사이즈를 나타냄
- bounds는 자신의 좌표 시스템에서 뷰의 위치와 크기를 나타냄
- frame은 view의 위치나 크기를 알고 싶을때, bounds는 view의 크기나 내부에 그림을 그릴때 사용
- 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.
- 하드웨어의 가속도 센서, 가압계, GPS, 주변광 센서 등을 이용할 수 없다. 카메라, 마이크, 전화기능을 사용할 수 없다
- API 중 푸시알림과 사진, 연락처, 캘린더에 액세스하기 위한 개인정보 보호 알림, handoff 및 messageUI 기능을 사용할 수 없다.
- 나머지로는 맥의 성능이 아이폰보다 더 뛰어나 CPU나 메모리 부담이 얼마나 되는지 알 수 없고, 네트워크 속도 테스트도 불가하며,페이스 아이디는 직접 얼굴 인식은 되지 않으나, 인식 및 비인식 처리는 가능하다.
- 앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체를 무엇이라고 하는가?
- 아카이브 : iOS에서 모델 객체를 저장하는 방법 중 가장 흔한 방법이다.
- 아카이빙 : 객체의 프로퍼티를 모두 기록하고, 파일시스템에 내용을 저장한다.
- 언아카이빙 : 아카이브한 데이터로 객체를 다시 만든다.
-
class Car: NSCoding { var name : String = "" var nemesis : Car var model : Int //아카이빙 func encode(with enCoder: NSCoder) { enCoder.encode(name, forKey: "name") enCoder.encode(nemes, forKey: "nemes") enCoder.encode(model, forKey: "model") } //데이터 스트림은 키-값 쌍으로 구성되어서 파일시스템에 저장된다. required init?(coder aDecoder: NSCoder) { name = aDecoder.decodeObject(forKey: "name") as! String nemesis = aDecoder.decodeObject(forKey: "nemesis") as! Car? model = aDecoder.decodeInteger(forKey: “model") } }
- UserDefaults : 키 - 값 쌍으로 저장하는 인터페이스이다.
- 런타임시 개체를 이용하요 기본 데이터베이스에서 사용하는 기본값을 읽어오기 때문에 값이 필요할 때마다 데이터베이스를 열 필요가 없다. 대용량의 데이터보다, 자동로그인 여부, 아이디, 환경설정에서의 설정 데이터값과 같은 단일 데이터 등을 보관한다.
- CoreData : 객체 그래프를 관리하기 위한 Framework이다.
- SQLite와 같이 테이블을 이용하지 않고, 객체를 생성하여, 데이터를 운영하기에 더 많은 저장공간과 메모리를 필요로 한다. 그렇지만 더욱 빠르게 데이터를 가져온다. Data Model을 생성한 후에 Entity를 생성한다.
- SQLite : Swift에 특별한 설치 없이 바로 사용할 수 있다.
- C언어로 작성되어 있기에 매우 가벼운 것이 특징이며, 전체 데이터베이스를 디스크 파일 1개에 저장하고 설정 자체가 매우 간편하기에 관리하기가 수월하다. SQLite는 iOS, Android, Linux, Window 등과 같이 다양한 운영체제에서 사용되고, 수많은 프로세스와 스레드의 접근으로부터 안전하다.
- Realm : SQLite와 같이 오픈소스이며, 모바일에 최적화된 라이브러리이다.
- SQLite, Core Data보다 속도가 빠르고 성능면에서 더 우수하다. 많은 작업들을 처리하기 위해 코드가 많이 필요하지 않으며, 메인 스레드에서 데이터의 읽기, 쓰기 작업을 모두 할 수 있어서 편리하다. 대용량의 데이터에 대해 무료로 사용할 수 있으며, 용량이 적고 큼에 상관없이 속도와 성능이 유지된다.
- 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체를 무엇이라고 하는가?
- UIViewController : View hierarchy를 관리하는 오브젝트로 Content ViewController와 Container ViewController가 있다.
- (추가로 알면 좋을 것들)
- UIApplication 객체
- UIApplication은 메인 이벤트 루프와 같은 것들을 담당하는 객체로 앱 상태 변화나 푸시 메시지 도착처럼 특수한 형태의 이벤트를 우리가 정의한 델리게이트 객체에 전달하여, 사전에 정의된 메소드를 호출할 수 있도록 한다.
- App Delegate 객체
- App Delegate 객체는 UIApplication 객체와 서로 연결되어 앱의 초기화, 상태 변화, 기타 이벤트를 핸들링 하는 역할을 한다. 이 객체는 각 앱에서 반드시 하나만 존재하도록 시스템에 의해 보장된다. (때문에 앱의 데이터 구조를 초기화하는데 사용되기도 한다.
- UIWindow 객체
- UIWindow 객체는 화면에서 하나 이상의 뷰에 대한 표현을 조정하는 역할을 한다. 대부분의 앱들은 메인 화면에 콘텐츠를 표현해주는 하나의 윈도우만 가지지만, 객체는 외부 화면에 표시되는 컨텐츠를 표현해주는 부가적인 윈도우를 가질 수도 있다. 우리는 앱의 콘텐츠를 변경할 때, 부가적인 윈도우를 가진다고 해서 윈도우 자체를 교체해서는 안되며, ViewController를 이용해야 한다.
- UIApplication 객체
- (참고) https://sibalja.tistory.com/3
- (참고) https://www.notion.so/32b4a19f75d04f33ad92cdde611b189e
- App thinning에 대해서 설명하시오.
- 앱이 디바이스에 설치될 때, 앱스토어와 OS가 디바이스에 특성에 맞게 설치되도록 하는 설치 최적화 기술을 말함. 최소한의 디스크 사용과 빠른 다운로드 제공. 앱 시닝은, slicing, bitcode, on-demand resouce가 있다.
- slicing : 앱이 지원하는 여러 디바이스에 대해 각각 조각 앱 번들을 생헝하고 해당 디바이스에 가장 적합한 조각을 전달하는 기술
- bitcode : 비트코드는 기계 언어로 번역되기 이전 단계의 중간표현을 말함.
- on-demand-resource : 필요할 때 다운로드를 받는다는 의미로 사용자가 필요하지 않는 리소스를 갖고 있지 않다가 사용할 때, 다운로드를 받는다.
- (참고) https://ttuk-ttak.tistory.com/42
- 앱이 디바이스에 설치될 때, 앱스토어와 OS가 디바이스에 특성에 맞게 설치되도록 하는 설치 최적화 기술을 말함. 최소한의 디스크 사용과 빠른 다운로드 제공. 앱 시닝은, slicing, bitcode, on-demand resouce가 있다.
- 앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
- UIApplication의 싱글톤 객체가 만들어집니다.
- (참고) https://github.com/jwonyLee/TIL/blob/master/iOS/Interview/UIApplicationMain.md
- @Main에 대해서 설명하시오.
- Swift 5.3부터는 @main(UIApplicationMain 대신에)을 사용한다. UIKit 기반 앱의 main entry point이다.
- (참고) https://jinnify.tistory.com/18
- 앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나요?
- foreground mode는 메모리 및 기타 시스템 리소스에 높은 우선순위를 가지며, 시스템은 이러한 리소스를 사용할 수 있도록 필요에 따라 background앱을 종료한다. background mode는 가능한 적은 메모리 공간을 사용해야 하며, 사용자 이벤트를 받기 어렵고 공유 시스템 리소스를 해제하고 이미지 객체 참조 등 메모리 제한.
- 상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.
- iOS 12 이하 버전에서는 AppDelegate가 2가지 역할을 했는데, process level의 이벤트 발생을 알려주고, UI상태 변화를 알려주었다. (1 process & 1 user interface)
- iOS 13부터는 상태 변화에 따른 동작은 SceneDelegate가 담당하게 되었음. (1 process & multiple user interface)
- 기존에는 UIWindow에서 객체에 대한 configuration도 진행했었는데 이제는 하나의 window 객체만 관리하지 못한다.
- 따라서 appdelegate의 일부 역할을 SceneDelegate에 넘겨 주었고, AppDelegate는 새로운 역할 하나를 더 맡게 되었다.
- process level의 이벤트 발생을 알려주고 (그대로)
- session life-cycledmf appDelegate에 알려주게 되었음 (신규)
- 기존 UI 상태 변화를 알려주는 것은 SceneDelegate에서 책임지게 되었고, AppDelegate는 새로운 Scene Session이 생성되거나 버려질 때 알리는 역할을 새로 맡게 되었다.
-
scene(_: willConnectTo: options:) sceneWillEnterForeground(_ :) sceneDidBecomeActive(_ :) sceneWillResignActive(_ :) sceneDidEnterBackground(_ :) sceneDidDisconnect(_ :) // iOS 12이전 applicationWillResignActive // active -> inactive 상태로 전환시 inactive전환 직전 실행 applicationDidEnterBackground // background 상태전환 직후 applicationWillEnterForeground // background -> foreground 상태로 전환시 foreground직전 applicationDidBecomeActive // active상태직후, 화면으로 돌아올 때마다 실행 applicationWillTerminate // 앱 종료시 willFinishLaunching // didFinish전에 호출되는 함수 didFinishLaunching // 앱 실행시 1번만 실행되는 함수
- (참고) https://github.com/iOS-SOPT-iNNovation/iOS_Traning/issues/4
- (참고) https://sueaty.tistory.com/135
- 앱이 In-Active 상태가 되는 시나리오를 설명하시오.
- 앱이 백그라운드에 잠시 머무는 상황이나, 앱이 로딩되는 상화 등
- scene delegate에 대해 설명하시오.
- iOS 13이상에서 앱에는 둘 이상의 scene이 있을 수 있으며, iOS, iPadOS 등에서 다중 창 앱을 빌드할 수 있다. 기존 AppDelegate에 있던 UI 상태 변화를 담당하는 메소드가 SceneDelegate로 이전되었습니다.
- (참고) https://github.com/lunchScreen/Interview_Questions/issues/41
- UIApplication 객체의 컨트롤러 역할은 어디에 구현해야 하는가?
- AppDelegate에 구현하여야 한다. UIApplication은 싱글톤 방식을 통해 접근하지만, 별도로 생성할 경우 런타임에서 에러를 발생시킨다.
- (참고) https://min-mon.tistory.com/entry/UIKit-UIApplication
- App의 Not running, Inactive, Active, Background, Suspended에 대해 설명하시오.
- Not running : 앱이 실행되지 않은 상태
- foreground : app이 실행되고 사용자에게 보여지고 있는 상태
- inactive : 앱이 실행중이나, 아직 아무런 이벤트를 받지 않은 상태. foreground에서 전화나 잠금 멀티태스킹 스크린 등에서 inactive상태를 가짐
- active : 앱이 실행중이며, 현재 이벤트를 받고 있고, 발생한 상태.
- background : 앱이 백그랑누드에 있는 상태며, 여전히 실행되고 있는 코드가 있는 상태.
- suspend : 앱이 백그라운드에 있고 실행되는 코드가 없는 상태.(app은 여전히 메모리에 존재하며, 서스펜드가 될 당시의 상태를 저장하고 있지만, cpu나 배터리를 소모하지 않고, 언제든지 메모리 부족등의 이유로 종료 가능)
- NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오.
- iOS 멀티 스레딩을 할 수 있는 방법이 2가지가 있다.
- GCD(Grand Central Dispatch)는 C기반의 low-level API
- NSOperation은 Obj-c기반으로 만들어진 high-level API
- 객체의 우선순위 및 준비 상태에 따라 대기열에 있는 객체를 실행한다. Operation Queue에 추가된 자겅ㅂ은 작업이 완료될 떄까지 대기열에 남아 있다. 작업이 추가된 후에는 대기열에서 직접 제거할 수 없다.
- 모든 작업이 끝나지 않은 상태에서 Operation Queue를 중지시키면 메모리 릭이 발생할 수도 있다.
- GCD에서는 할 수 없는 기능들(재개, 취소, 중지)을 제공하지만 구현이 복잡하고 무겁다.
- KVO(Key-Value Observing) 사용이 가능하다. (GCD는 사용 불가)
- operation (read only) : 현재 큐에 있는 작업의 갯수
- operationCount (read only) : 현재 큐에 있는 작업의 갯수
- maxConcurrentOperationCount (readable and writable) : 큐에서 동시에 실행할 수 있는 작업의 최대 갯수
- suspended (readable and writable) : 실행 작업을 적극적으로 스케줄링하고 있는지 여부에 대한 Boolean 값
- name (readable and writable) : operationQueue의 이름
- 작업간의 의존성 : 어떤 작업을 다른 작업이 성공적으로 수행된 후에 실행할 수 있게 하는 작업의 계층을 만들 수 있다.
- GCD(Grand Central Dispatch) Queue(Dispatch Queue)
- 동시성 모델을 매우 간단하게 사용할 수 있는 low-level C기반의 API
- 앱의 메인 스레드 또는 백그라운드 스레드에서 작업의 실행을 직렬 또는 동시에 관리하는 객체이다.
- 작업 항목을 동기 혹은 비동기적으로 예약한다.
- 동기적 : 여러가지 작업을 순차로 실행한다.
- 비동기적 : 모든 동기 작업이 완료되기 전에 추가 스레드의 작업을 비동기로 실행해서 작업을 병렬적으로 수행하는 방식이다.
- 메인 큐에서 작업 항목을 동기적으로 실행하면 교착상태가 발생할 수도 있다.
- (참고) https://thoonk.tistory.com/30
- GCD API 동작 방식과 필요성에 대해 설명하시오.
- 백그라운드에서 스레드를 관리하면서 동시적으로 작업을 실행시키는 low-level 기반의 API
- 앱을 실행하면 시스템이 자동으로 메인스레드 위에서 동작하는 Main 큐(Serial Queue)를 만들어서 작업을 수행함. 그 외에 여러개의 Global 큐(Concurrent Queue)를 추가적으로 만들어서 큐를 관리한다.
- Dispatch Queue : FIFO 순서로 작업을 실행시키는 역할을 담당
- Serial Dispatch Queue: 한번에 한 작업만 실행시킨다.
- Concurrent Dispatch Queue: 시작한 작업이 끝나는것을 기다리지 않고 가능한 많은 작업을 실행시킨다.
- Main Dispatch Queue, 앱의 메인 스레드에서 작업을 실행할 수있는 전역에서 사용가능한 시리얼 큐
- DispatchQueue.main: main thread queue, serial Queue로 동작한다
- 필요성 : GCD 사용 이전에는 멀티 스레딩 사용을 위해서 스레드와 OperationQueue 등의 클래스를 사용했다. 스레드의 경우에는 복잡하고 ciritical sction을 이용한 lock처리가 불편했다. OperationQueue는 무겁고 boilerplate 코드들이 많이 필요한 문제가 있었다. Apple에서 제공하는 GCD를 통해 스레드 관리를 앱레벨에서 OS레벨로 올렸다.
- 또한, 네트워크 작업처럼 헤비한 작업을 할때, GCD를 적절히 이용한다면 앱을 더 효율적으로 설계할 수 있다.
- Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.
- userInteractive : 사용자 터치와 같이 제일 급한거
- userInitiated : 사용자가 결과를 기다리는 작업 이것도 거의 바로 시행되어야 할 작업
- default : 위의 레벨보다 조금 덜 중요한 작업
- utility : 수초~ 수분 걸리는 나름 무거운 작업 ex) 네트워크 및 파일 불러오기
- background : 사용자에게 바로 인식될 필요는 없는 작업 ex) 뉴스를 미리 다운 받기, 용량이 큰 영상을 받기, 사용자의 위치를 변경하기
- iOS 앱을 만들고, User Interface를 구성하는 데 필수적인 프레임워크 이름은 무엇인가?
- UIKit입니다.
- UIKit이란 사용자의 인터페이스를 관리하고, 이벤트를 처리하는게 주 목적인 프레임워크입니다.
- (참고) https://www.notion.so/iOS-User-Interface-b8014e53472e400ea4718cf750c1d833
- Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오.
- Foundation 프레임워크는, 데이터 저장 및 지속성, 텍스트 처리, 날짜 및 시간 계산, 정렬 및 필터링, 네트워킹을 포함하여 앱 및 프레임워크를 위한 기본 기능 계층을 제공한다. 코코아 터치 프레임워크에 포함된 프레임워크이며 애플에서 기본적으로 제공하는 프레임워크.
- 위의 설명에서 말하는 것들이 class로 있으며, import Foundation에서 Foundation의 내부를 열어보면 open class로 위 에 것들이 포함되어 있는 것을 확인할 수 있다.
- (참고) https://developer.apple.com/documentation/foundation
- Delegate란 무언인가 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.
- delegate란 다른 객체에게 처리해야할 일 중 일부를 위함하기 위해 사용한다. 객체지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는게 아니라 분산하게 되는데, 일부를 다른 객체에 넘김으로써 중요한 역할을 함. 기능을 위임하여, 직접 구현해야 하는 부분이 적어짐. UITableViewDelegate, UITableViewDataSources 등도 delegate를 활용한 것 중의 일부.
- ratain이 당연히 일어남. (이걸로 예전에 개발하다가 이슈 발생해서 엄청 ㅠ하 ;) delegate를 객체로 활용해 사용하려면, weak으로 설정해주어야 한다. 또한, A-B의 delegate 변수를 들고 있고, B-A를 또 들고 있다면 있어도 문제가 발생함.
- NotificationCenter 동작 방식과 활용 방안에 대해 설명하시오.
- Notification: 알림 센터를 통해 등록된 모든 관찰자에게 broadcast되는 정보 컨테이너
- NotificationCenter: 등록된 모든 Observaer에게 정보를 전달하는 메커니즘
- Key: Value로 구성되어 동작한다.
- 동작 방식
- 옵저버를 등록합니다.
- 시스템에서 등록된 옵저버를 감시하면서 변경 사항이 발생하면 등록한 객체에게 통지합니다.
- 활용 방안
- 화면의 가로세로 전환, 데이터의 변환이 일어났을 때
- UIKit 클래스들을 다룰 때 꼭 처리해야하는 애플리케이션 쓰레드 이름은 무엇인가?
- 메인 스레드이다. (UI는 안드로이드 개발에서도 메인에서!! 그 이유는 그렇게 설계되었기 때문에)
- UIKit은 Thread-Safe하지 않기 때문에
- UIKit의 대부분의 요소들은 nonatomic이다. 즉, Thread-Safe하지 않다. UIKit이란 거대한 framework를 Thread-Safe하게 만드는 것이 비현실적이며, Thread-Safe으로 만드려면 atomic으로 하거나 NSLock 등의 처리를 해야하는 많은 문제가 존재한다. 이러한 처리를 하게 되면 성능 이슈가 발생할 수 있으며, 그렇기 때문에 Serial하게 처리하게 되면 이런 문제점이 발생하게 된다. 따라서 UI는 Main Thread에서 Sync하게 동작한다.
- 두번쨰는 iOS의 Graphics rendering이 궁극적으로 동기식이기 때문이다. 안드로이드를 학습할 때, 학교 교수님께서 UI에서 매우 상세하게 설명해 주셨는데, 이벤트 루프 무한히 돌면서 사용자의 언제 들어올 지 모르는 이벤트를 받아야 하기 때문이다. 근데 이벤트 루프 말고도 모두 메인해서 하면 사용자의 이벤트를 놓칠 수도 있고, 여러 문제가 있어서 메인이 아니라 여러 스레드로 분리하는 기술도 이 때문에 존재한다.
- (참고) https://medium.com/remember/%EC%99%9C-ui-%EC%B2%98%EB%A6%AC%EB%A5%BC-main-thread%EC%97%90%EC%84%9C-%ED%95%B4%EC%95%BC%ED%95%98%EB%82%98-5b2ba268f4eb
- App Bundle의 구조와 역할에 대해 설명하시오.
- 애플 공식문서에 따르면 실행 가능한 코드와 리소스 등을 한 공간에 묶는 파일 시스템에 있는 디렉토리이다.
- 즉, 번들이란 실행 가능한 코드와 코드에 의해 사용되는 리소스를 갖는 standardized, hierarchical 디렉토리 구조이다.
- App Bundle 파일의 유형
- Info.plist (필수) : 응용 프로글매에 대한 구성 정보를 포함하는 구조화된 파일. SwiftUI를 사용하면 초기에 Info.plist파일이 눈에 보이게 만들어지지 않는다. 추후에 만들어주면 되며, 안보이는 정보는 프로젝트 그 폴더 쪽에 있다.
- Excutable (필수) : 모든 응용 프로그램에서는 실행 가능한 파일이 있어야 한다. 앱의 기본 진입점과 앱의 대상에 정적으로 링크된 모든 코드가 포함되어 있음.
- Resource files : 일반적으로 앱의 이미지, 사운드, nib파일, 문자열 파일 등이 위치한다. 대부분의 리소스 파일을 특정 언어 또는 지역에 대하여 현지화하거나 모든 지역에서 공유할 수 있음.
- Other support files : iOS 앱 번들에 사용자 정의 프레임워크 또는 플러그인은 포함할 수 없음.
- iOS App Bundle 파일의 구조
- MyApp (필수) : 앱의 코드를 포함하는 실행 파일
- 응용 프로그램 아이콘 (필수/권장)
- Info.plist (필수) : 번들 ID, 버전 번호 및 앱 표시 이름과 같은 응용 프로글매의 궁성 정보가 포함되어 있음.
- Launch Image (권장)
- MainWindow.nib (권장)
- Settings.bundle : 설정 앱에 추가하려는 앱 별 환경 설정을 포함하는 특수 유형의 플러그인
- 사용자 지정 리소스 파일 : 지역화되지 않은 리소스는 최상위 디렉토리에 배치되고, 지역화된 리소스는 앱 번들의 언어별 하위 디렉토리에 배치 (단, iOS App Bundle은 'Resource' 라는 사용자 지정 폴더를 포함할 수 없음.)
- (참고) https://github.com/jwonyLee/TIL/blob/master/iOS/Interview/AppBundle.md
- (참고) https://sihyungyou.github.io/iOS-app-bundle/
- 모든 View Controller 객체의 상위 클래스는 무엇이고 그 역할은 무엇인가?
- UIViewController를 상속받습니다.
- 역할은 뷰와 사용자의 상호작용에 응답하며, 기본 데이터의 변경에 대한 응답으로 콘텐츠를 업데이트하거나, 앱에서 다른 ViewController를 포함한 다른 객체와 조정합니다. 뷰 크기 조정 및 전체 인터페이스의 레이아웃을 관리합니다.
- 자신만의 Custom View를 만들려면 어떻게 해야하는지 설명하시오.
- xib를 이용하여 만들 수도 있으나, 개인적으로 스토리보드를 사용하면 협업에서 충돌이나 속도 등 불편한 점이 너무 많아서 아예 사용하지 않고, 나는 주로 코드로 개발을 진행하므로 코드로 Custom View를 만드는 과정에 대해서 이야기 할 것임.
- 그냥 UIView 인스턴스를 생성하고 사용하면 된다. 사용하고자 하는 쪽에 UIViewController에 커스텀뷰(UIView)의 프레임 크기를 지정해주고 addSubView로 넣어주면 된다.
- 그냥 내가 평소에 MVVM으로 개발할 때, View를 분리하여 커스텀 뷰를 구성하는 것과 동일하다.
- View 객체에 대해 설명하시오.
- UI의 기본구성 요소이다. 화면의 직사각형 영역에 대한 콘텐츠를 관리하고 모든 뷰에 공통적인 동작을 정의한다. 모든 뷰 클래스의 상위 클래스다. 모든 조작은 main thread에서 해야한다. 유저와의 상호작용을 담당한다.
- UIView 에서 Layer 객체는 무엇이고 어떤 역할을 담당하는지 설명하시오.
- Layer는 뷰의 렌더링을 위하여 뷰에 속해 뷰를 지원해주는 CroeAnimation 계층이다. Layer는 뷰의 컨텐츠와 애니메이션을 담당한다. UIView는 객체에 나타나는 컨텐츠의 layer를 갖고 있고, UIView는 이미지나 애니메이션들을 직접 제어하지 않고, View에게 작업을 주면 VIew 내부의 Layer객체에서 직접 수행을 한다.
- UIView는 CALayer객체를 래핑하고 있다.
- UIWindow 객체의 역할은 무엇인가?
- UIView는 UIWindow의 부모이다.
- UIWindow는 UI에 backdrop(배경)을 제공하고, 중요한 이벤트 처리 행동(behaviors)을 제공하는 객체이다.
- Window는 자신의 시각적 모습을 갖고 있지는 않지만, 앱 View의 프레젠테이션에 중요하다. 스크린에 나타나는 모든 View는 Window로 묶여 있으며, 각 Window는 앱의 다른 View와 독립적이다. 앱에서 받은 이벤트는 해당 View객체로 라우팅되고, 해당 이벤트는 해당 View로 전달된다.
- Windows는 앱의 기본요소이지만, 코드에서 최소한의 방식으로 상호작용한다.
- UIKit은 대부분의 Window관련 상호작용을 처리하며, 필요한 경우 다른 객체를 사용하여, 많은 앱의 행동(behaviors)을 구현한다.
- (정리)
- 역할 : 앱의 시각적 콘텐츠를 담으며, 뷰들과 다른 앱 객체들에게 터치 이벤트를 전달하는 역할을 한다. 오리엔테이션 변화를 쉽게 하기 위해 앱의 뷰 컨트롤러들과 협력한다.
- (참고) https://zeddios.tistory.com/283
- UINavigationController 의 역할이 무엇인지 설명하시오.
- UINavigationController는 네비게이션 스택을 사용하여, 다른 뷰 컨트롤러를 관리하는 역할을 한다. LIFO 방식으로 네비게이션 바를 통해 뷰를 이동할 때, 스택 구조로 쌓인다.
- TableView를 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메서드를 설명하시오.
-
// 섹션에 표시할 행의 개수 @available(ios 2.0, *) func tableview(_ tableView: UITableView, numberOfRowInSection section : Int) -> Int @available(ios 2.0, *) // 특정 위치에 표시할 셀을 요청하는 메서드 func tableview(_ tableView: UITableView, cellForRowAt indexPath : IndexPath) -> UITableViewCell
- 동작 방식
- 처음 셀이 awakeFromNib()로 호출, 화면에 모든 항목을 tableView(_:prefetchRowsAt:indexPath:)로 통해 호출 프리패치 화면이 10개 이상 호출된다. 다음으로는 cellForRow를 호출 willDisplay 호출 prepareForReuse 호출
-
- 하나의 ViewController 코드에서 여러 TableViewController 역할을 해야 할 경우 어떻게 구분해서 구현해야 하는지 설명하시오.
- 코드 기반으로 커스텀 테이블 뷰를 identifer를 통해서 delegate 및 dataSource 부분에서 if문 혹은 switch를 통해서 테이블 뷰의 아이디나 태그에 따라 다르게 처리하도록 구현해준다.
- setNeedsLayout와 setNeedsDisplay의 차이에 대해 설명하시오.
- (정리) setNeedsLayout()메소드와 setNeedsDisplay() 메소드 모두 호출 즉시 실행되지 않고, 다음 update cycle에 변경사항이 적용된다. setNeedsLayout은 layoutSubview 메소드를 setNeedsDisplay는 draw 메소드를 시스템이 호출하게끔 유도한다. setNeedsLayout() 메소드는 모든 핸들러가 종료되고 권한이 main run loop로 돌아오는 시점에 view의 position이나 layout에 관한 면화를 적용시키고 setNeedsDisplay() 메소드는 다음 드로잉 사이클이 오면 그때 쌓여있는 그려야 할 컨텐츠들을 동시에 적용 시킵니다.
- (참고) https://jeongupark-study-house.tistory.com/165
- (참고) https://velog.io/@zeke/difference-between-setNeedsLayoutsetNeedsDisplay
- NSCache와 딕셔너리로 캐시를 구성했을때의 차이를 설명하시오.
- 캐시 처리를 하는 이유는 고용량, 고화질 이미지를 계속해서 다운로드 하면 사용자의 네트워크에서 리소스를 계속 소모하고, 다운로드가 완료되는데까지 시간이 오래 걸린다. 그래서 다운 받은 이미지를 캐싱해서 저장해두고 그 이미지가 사용되면 리소스 소모 없이 빠르게 보여줄 수 있다.
- NSCache: 저장 컨테이너로 리소스가 부족할 때 제거될 수 있는 Key-Value 쌍을 저장, 메모리 관리가 기본적으로 제공된다. 다른 앱에서 메모리를 더 사용하려고 하면 자동으로 캐시되어 있던 데이터를 지우고 메모리를 해제한다.
- 차이점
- NSDictionary는 메모리가 부족하다는 시스템 경고를 받을 때, 메모리를 정리하는 코드를 미리 직접 작성해야 하지만, NSCache는 자동으로 처리한다. NSCache는 Thread-Safe하며 NSDictionary는 Thread-safe 하지 않기 때문에 데이터가 접근할 때 따로 처리해야 한다. NSCache는 Key를 복사하지 않고 유지한다.
- 캐시 처리를 하는 이유는 고용량, 고화질 이미지를 계속해서 다운로드 하면 사용자의 네트워크에서 리소스를 계속 소모하고, 다운로드가 완료되는데까지 시간이 오래 걸린다. 그래서 다운 받은 이미지를 캐싱해서 저장해두고 그 이미지가 사용되면 리소스 소모 없이 빠르게 보여줄 수 있다.
- URLSession에 대해서 설명하시오.
- URLSession은 iOS에서 제공하는 HTTP를 이용한 네트워킹을 통해 데이터를 주고받을 수 있게 도와주는 API를 제공하는 클래스이다. URLSession은 Thread-Safty하기 때문에 어떤 스레드에서든 자유롭게 Session과 Task를 생성할 수 이싿.
- URLSession은 URLSessionConfiguartion을 통해서 생성할 수 있다. 이렇게 생성된 세션은 한개 이상의 URLSessionTask를 생성할 수 있으며 이를 통해여 실제로 서버와 통신할 수 있다.
- URLSessionConfiguration은 아래의 세가지 타입으로 만들 수 있다.
- Default : 기본적인 네트워킹 정책을 사용한다.
- Ephemeral : 쿠키와 캐시를 저장하지 않을 때 사용한다.
- Background : 앱이 background에 있을 때 컨텐츠를 다운로드 혹은 업로드할 때 사용한다.
- URLSessionTask 또한 작업에 따라 세가지로 분류할 수 있다.
- URLSessionTaskDataTask : 데이터를 받는 작업 수행 시 사용한다.
- URLSessionTaskUploadTask : 데이터 업로드 시 사용한다.
- URLSessionTaskDownloadTask : 데이터 다운로드 시 사용한다.
- (참고) https://velog.io/@folw159/iOS-URLSession
- prepareForReuse에 대해서 설명하시오.
- 테이블 뷰를 사용할 때 재사용하는 경우가 대부분이다. 재사용 셀을 사용할 때 모든 값이 초기화 되어야 하는데, 이 경우에 초기화를 하기 위해서 사용하는 함수이다.
- 다크모드를 지원하는 방법에 대해 설명하시오.
- 방법은 정말 다양하겠지만, 개인적으로 가장 좋은 방법은 Asset - ColorSet을 만들어서 Color를 지정해주는 것이 가장 좋은 방법이라고 생각한다.
- ViewController별로 따로 다크모드를 지원이 가능한데, overrideUserInterfaceStyle = .dark로 viewDidLoad() 타이밍에 해주거나 UIView만도 적용이 가능하다.
- ViewController의 생명주기를 설명하시오.
- init : ViewController의 객체가 생성된다.
- loadView : View를 메모리에 로드한다.
- ViewDidLoad : view의 Controller가 메모리에 로드된 후 호출한다. 보통 화면이 표시되기 전 초기화하는 작업을 추가한다.
- awakeFromNib : nib파일이란 xib와 스토리보드를 Xcode가 컴파일 한 바이너리 파일로 런타임 시, View를 생성하기 위해 nib 파일을 메모리에 로드하고 초기화한다. awakeFromNib은 nib파일이 로드된 후 서비스할 준비가 되어있는 상태에 호출된다.
- (호출 순서) awakeFromNib - loadView - viewDidLoad
- viewWillAppear : 뷰가 표시되기 전에 호출된다.
- viewDidAppear : 뷰가 표시된 후 호출된다. 뷰에 적용할 애니메이션 작업을 추가하는게 좋다.
- viewWillDisappear : 뷰가 사라지기 직전에 호출
- viewDidDisappear : 뷰가 사라지고나서 호출
- viewDidUnload : View가 메모리에서 해제된 후 호출
- TableView와 CollectionView의 차이점을 설명하시오.
- TableView : UIScrollView를 상속 받고 있으며, section - row의 구성이며 section의 header와 footer를 가질 수 있다.
- ColleftionView : 테이블 뷰의 기능을 대부분 갖고 있으며, 차이점은 레이아웃 객체가 있어서 원하는 모양으로 커스텀하여 사용할 수 있다.
'deprecated > 잡동사니' 카테고리의 다른 글
iOSInterviewquestions - ARC (0) | 2022.04.02 |
---|---|
iOSInterviewquestions - Rx (0) | 2022.04.02 |
iOSInterviewquestions - Swift (0) | 2022.04.02 |
iOSInterviewquestions - Autolayout (0) | 2022.04.02 |
[iOS] 🗺 KakaoMap API 환경설정 (0) | 2022.02.18 |