iOS 개념정리 - 1

유호준·2022년 3월 31일
0

iOS

목록 보기
1/8

iOSInterviewquestions를 보고 정리하기!

Bounds 와 Frame 의 차이점을 설명하시오.

Frame

  • super view 좌표계에서 view의 위치와 크기를 나타낸다.
  • frame의 size는 view 자체의 크기가 아니라 view가 차지하는 영역을 감싸서 만든 사각형이다.

Bounds

  • 자신의 좌표계에서 view의 위치와 크기를 나타낸다.
  • bounds의 size는 view 자체의 영역을 나타낸다.

실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.

하드웨어

  • 센서 기능들을 사용할 수 없다.
  • 두 손가락으로 하는 기능들을 테스트 할 수 없다.
  • 마이크를 이용할 수 없다.
  • 전화기능을 사용할 수 없다.
  • 카메라를 사용할 수 없다.

API

  • 애플의 푸시 알림 받기와 보내기를 지원하지 않는다.
  • 사진, 연락처, 캘린더에 접근하기 위해 개인 정보 보호 알림을 지원하지 않는다.
  • Handoff 기능을 지원하지 않는다.
  • MessageUI 기능을 지원하지 않는다.

ETC

  • 실제 기기에 가해지는 부하를 확인할 수 없다.
  • 네트워크 속도 테스트를 할 수 없다.

앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체를 무엇이라고 하는가?

Core Data

  • 애플리케이션의 영구 데이터를 저장

Core Data의 실행 취소 관리자는 변경 사항을 추적하고 개별적으로, 그룹으로 또는 한 번에 모두 롤백 할 수 있으므로 앱에 실행 취소 및 다시 실행 지원을 쉽게 추가 할 수 있습니다.

  • 임시데이터를 캐시
  • 단일 기기에서 앱에 실행 취소 기능을 추가하는 프레임워크

UserDefaults

  • 기본 객체 저장
  • 파일 참조 유지
  • 기본값 변경에 대한 대응
  • 관리되는 환경에서 기본값 사용

앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체를 무엇이라고 하는가?

ViewController

  • View Heirachy Management
    뷰의 계층 관리
  • 데이터 중개자 역할
  • View에서 일어나는 User Interaction
  • Resource Management
  • Adaptivity

생명주기

  • init(coder:)
    스토리보드를 통해 ViewController들을 만들 경우 ViewController의 객체가 생성될 때 초기화하는 메소드
    이 메소드에서 초기화 작업을 할 때 ViewController는 그들의 lifetime동안 필요한 자원들을 할당받게 된다. 아직 이 시점에서는 View가 생성된 것이 아니기 때문에, View의 요소들에 대한 접근을 시도한다면 에러가 발생한다.
  • init(nibName:bundle:)
    스토리보드가 아닌 분리된 nib파일로 관리될 경우 이 메소드를 초기화 용도로 사용할 수 있다.
  • loadView
    본격적으로 화면에 띄워질 View를 만드는 메소드이다. outlet과 action들이 이 메소드에서 생성되고 연결된다.
  • viewDidLoad
    이 메소드가 호출되는 시점에서는 outlet들이 메모리에 위치하고 있다.
    생애주기에서 단 한번만 호출
    화면에서 보여지기 전 데이터들을 뿌려주는 행위에 대한 코드를 작성
  • viewWillApper
    ViewController의 화면이 올라오고 난 이후에 호출되는 메소드
    애니메이션을 실행시키거나, 데이터의 업데이트등을 수행
    화면 전환을 통해 현재의 화면으로 돌아올때도 호출
  • viewDidAppear
    View가 완전히 화면에 나타나고 호출되는 메소드
  • didReceiveMemoryWarning
    너무 많은 메모리를 사용한다면 이를 알리는 메소드
    이를 무시하면 강제종료
  • viewWillDisappear
    다음 화면으로 전환되기 전, 화면에서 사라질 때 호출
  • viewDidDisappear
    화면에서 완전히 사라지고 나서 호출
  • deinit
    메모리에서 사라지기 전 호출
    ViewController가 사라졌다고해서 메모리에서 해제되는 것은 아님

App thinning에 대해서 설명하시오.

애플리케이션이 디바이스에 설치될 때, 앱스토어와 운영체제가 디바이스의 특성에 맞게 설치되도록 하게 하는 설치 최적화 기술

슬라이싱

디바이스에 대해 각각 조각 애플리케이션 번들을 생성하여, 해당 디바이스에서 가장 적합한 조각을 전달하는 기술

비트코드

기계어로 번역되기 이전 단계의 중간 표현이다. 비트코드를 사용하여 업로드를 하면 애플이 애플리케이션을 재컴파일하여 앱 바이너리를 생성한다. 사용하지 않으면 모든 디바이스 경우에 따라 바이너리로 생성하여 합쳐져 fat binary 라는 것이 업로드되지만, 비트코드를 사용하면 필요 경우에 따라 재컴파일하게 되므로 최적화가 가능하다.

주문형 리소스(on-demand resource)

리소스를 필요할 때 다운받는 것을 말한다

앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?

func UIApplicationMain(_ argc: Int32, 
                     _ argv: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>, 
                     _ principalClassName: String?, 
                     _ delegateClassName: String?) -> Int32

Parameters

  • argc
    argv의 인수 개수, 일반적인 main 함수와 동일
  • argv
    인수, 일반적인 main 함수와 동일
  • principalClassName
    UIApplication 클래스 또는 하위 클래스의 이름, nil일 경우 UIApplication
  • delegateClassName
    UIApplicationDelgate가 인스턴스화 되는 클래스 이름, 기본 nib 파일에서 delegate 객체를 불러오는 경우 nil

Return

값을 반환하지 않는다.

Description

주 클래스에서 UIApplication 객체를 인스턴스화하고 UIApplicationDelgate를 인스턴스화하고 설정한다. 또한 응용프로그램의 실행 루프를 포함하여 이벤트 루프를 설정하고 이벤트 처리를 시작한다. 응용프로그램의 Info.plist 파일이 NSMainNibFile 키와 값에 유효한 nib 파일 이름을 포함하여 로드할 nib파일을 지정하는 경우 해당 nib 파일을 로드한다.

UIApplication

모든 iOS앱에는 하나의 UIApplication 인스턴스(또는 드물게 UIApplication의 하위 클래스)가 있다. 앱이 시작되면 시스템은 UIApplicationMain함수를 호출하여 UIApplication 객체를 만든다.

UIApplication의 주요 역할은 사용자 이벤트의 초기 라우팅을 처리하는 것이다. UIControl에 의해 전달된 작업 메시지를 적절한 대상 객체에 전달한다. UIApplication 객체는 open windows(UIWindow 객체) 목록을 유지하며 이를 통해 앱의 UIView 객체를 검색할 수 있다.

UIApplication 클래스는 UIApplicationDelegate 프로토콜을 준수하고 일부 메서드를 구현해야되는 delegate 객체를 정의한다. UIApplication 객체는 delgate 객체에게 앱 시작, 메모리 부족 경고 및 앱 종료와 같은 중요한 런타임 이벤트를 알린다.

앱은 openURL 메서드를 통해 이메일 또는 이미지 파일과 같은 리소스를 처리할 수 있다.

UIApplication 객체를 사용하여 다음과 같은 동작을 수행할 수 있다.

  • beginIgnoringInteractionEvents
    들어오는 터치 이벤트를 일시적으로 중단
  • registerForRemoteNotifications
    원격 알림 등록
  • applicationSupportsShakeToEdit
    유저가 기기를 흔들었을 때 나타나는 undo, redo 버튼을 표시하지 않을 수 있다.
  • canOpenURL
    URL 체계를 처리하기 위해 등록된 앱이 설치되어 있는지 확인
  • beginBackgroundTask
    백그라운드에서 작업을 완료할 수 있도록 앱 실행 확장
  • scheduleLocalNotification, cancelLocalNotification
    로컬 알림 예약 및 취소
  • beginReceivingRemoteControlEvents, endReceivingRemoteContorlEvents
    원격 제어 이벤트 수신 조정
  • 앱 수준 상태 복원 작업 수행

@main에 대해서 설명하시오.

Swift에서는 @main 어노테이션을 통해 EntryPoint를 지정한다. @main을 사용하면 Top-Level 코드 작성을 대체할 수 있다. 기존에는 @UIApplicationMain를 사용했으나 이는 클래스에서만 사용이 가능하다.
이를 해결하기 위해 @main 속성을 사용하게 되었다.

Top-Level 코드?
Top-Level 코드는 0개 이상의 명령문, 선언 및 표현식으로 구성되며 함수, 클래스 또는 다른 무언가로 감싸지지 않은 모든 구문을 의마한다. Top-Level 코드에서 선언된 변수, 상수 및 그 외 선언은 동일 모듈의 일부인 모든 소스 파일의 코드에서 접근할 수 있다. Top-Level 코드는 Top-Level 선언과 실행 가능한 Top-Level code 두가지로 나눌 수 있다. 선언은 선언만으로 구성되어 모든 swift 소스 파일에서 허용되지만, 실행 가능할 코드는 선언 뿐만이 아닌 명령문 및 표현식이 포함되며 Entry Point로만 허용된다.

앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나요?

  • foreground 상태에 있을때에는 메모리 및 기기 리소스를 최우선적으로 가지며 필요시 부족한 메모리만큼 background 상태의 애플리케이션을 종료한다.
  • background 상태일 경우에는 가능한 적은 메모리 공간을 사용해야하는 제약이있다. 하지만 아래의 경우에는 실행시간을 할당 받는다.
    1. AirPlay, PiP를 사용한 오디오 통신
    2. 사용자 위치 서비스
    3. Voice over IP
    4. 외부 악세서리와의 통신
    5. 블루투스 LE 통신
    6. 서버에서의 업데이트
    7. Apple Push Notificaiton

앱의 상태

  • not Runing
    앱이 실행되지 않은 상태
  • Foreground
    1. Inactive : 앱이 실행중이나 아무런 이벤트를 받지 않은 상태
    1. Active : 현재 이벤트를 받고 있고 발생한 상태
  • Background
    앱이 백그라운드에 있는 상태이지만 여전히 실행되고 있는 코드가 있는 상태
  • Suspened
    앱이 백그라운드에 있으나 실행되고 있는 코드가 없는 상태이며, CPU나 배터리를 소모하지않고 언제든지 종료될 수 있다.

상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.

  • application
// 앱이 실행된 직후 사용자의 화면에 보여지기 직전에 호출
func application(_ application: UIAppliscation, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
// 앱 최초 실행될 때 호출되는 메소드
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool
  • applicationWillTerminate
    앱 종료시

iOS 13에서는 iPad가 multi UI를 지원하며, ScenceDelegate로 이전

  • applicationWillResignActive
    inactive 전환 직전 실행, 홈 버튼을 누르는 등의 일시정지를 처리하는 로직 필요
  • applicationDidEnterBackground
    background 상태 전환 직후
  • applicationWillEnterForeground
    foreground 전환 직전
  • aplicationDidBecomeActive
    active상태 직후, 앱이 백그라운드에서 포어그라운드로 올라온 이후에도 실행

앱이 In-Active 상태가 되는 시나리오를 설명하시오.

  1. 사용자가 앱을 실행한다: Not running → In-Active → Active
  2. 앱 실행도중 홈 버튼을 누른다: Active → In-Active → Background
  3. 앱을 다시 켠다 : Background → In-Active → Active
  4. 앱이 백그라운드에 있다가 Suspended 상태로 전이 : Active → In-Active → Background → Suspended

참고자료

0개의 댓글