면접스터디 3W

apwierk·2022년 11월 3일
0

개인 공부

목록 보기
10/22
post-custom-banner

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

App store 및 운영 체제는 사용자의 기기 및 운영체제 버전에 맞게 app delivery를 조정하여 최소한의 설치공간을 사용할 수 있도록 iOS, tvOS, watchOS앱들의 설치를 최적화한다.
App thinning이라고 불리는 최적화를 통해 device의 기능 대부분을 사용하고 최소 디스크 공간을 차지하며 향후 Apple에 의한 업데이트들을 수용하는 앱을 생성할 수 있다.
더 빠른 다운로드와 다른 앱과 콘텐츠를 위한 더 많은 공간은 더 나은 사용자 경험을 제공한다.

App thinning에는 슬라이싱(slicing), 비트코드(bitcode), 주문형 리소스(on-demand resource)가 있다.

Slicing (iOS, tvOS)

: 다양한 기기와 운영체제 버전에 대하여 여러가지 app bundel의 변형(variants)을 생성하고 전달하는 과정
변형(variants)은 실행 가능한 아키텍쳐, 리소스만 포함한다.
앱의 전체 버전을 계속 개발하고 앱스토어 커넥트에 업로드한다. 앱스토어는 앱이 지원하는 기기 및 운영 체제 버전에 따라 다양한 변형(variants)을 생성하고 제공한다.
앱스토어에서 각 변형에 적합한 이미지, GPU리소스 및 기타 데이터를 선택할 수 있도록 자산 카탈로그를 사용한다.
사용자가 앱을 설치하게되면 사용자의 기기 및 기기의 운영 체제 버전에 맞춰 변형(variants)이 다운로드가 된다.

Xcode는 개발 중에 슬라이싱(slicing)을 시뮬레이션하므로 로컬에서 앱의 변형(variants)을 만들고 테스트 할 수 있다. 기기나 시뮬레이터에서 앱을 빌드하고 실행할 때 Xcode는 앱을 슬라이싱(slicing)한다.
아카이브를 생성할 때, Xcode에는 앱의 전체 버전을 포함하지만 아카이브에서 변형(variants)을 내보낼 수 있다.

참고
슬라이스 앱은 iOS및 tvOS 9.0 이상을 실행하는 장치에서 지원된다. 그렇지 않으면 앱스토어는 고객에게 범용 변형을 제공한다. 범용 변형은 MDM(모바일 기기 관리), Apple School Manager 또는 Apple Business Manager를 통해 대량으로 구매합 앱 또는 iTunes 12.6 또는 이전 버전을 사용하여 다운로드한 앱을 통해서도 제공된다.

비트코드

: 컴파일된 프로그램의 중간 표현
비트코드가 포함된 앱스토어 컨넥트에 업로드하는 앱은 앱스토어에서 컴파일 및 연결된다. 비트코드를 포함하면 애플은 앱의 새 버전을 앱스토어에 제출할 필요 없이 향후 앱 바이너리를 다시 최적화할 수 있다.

앱 바이너리는 컴퓨터가 실행할 기계어 코드를 포함하는 파일

iOS 앱의 경우 비트코드가 기본값이지만 선택 사항이다. watchOS 및 tvOS 앱의 경우 비트코드가 필요하다. 비트코드를 제고앟는 경우 앱 번들의 모든 앱과 프레임워크(프로젝트의 모든 대상)는 비트코드를 포함해야 한다.

Xcode는 기본적으로 앱의 기호를 숨겨서 읽을 수 없서 애플에다. 앱을 앱스토어 컨넥트에 업로드할 때 기호를 포함할 수 있는 옵션이 있다. 기호를 포함하면 TestFlight를 사용하여 앱을 배포하거나 앱스토어를 통해 앱을 배포할 때 애플에서 앱에 대한 충돌 보고서를 제공할 수 있다. 기호화 충돌 보고서를 직접 수집하고 싶다면 기호를 업로드할 필요가 없다. 대신 앱을 배포한 후 비트코드 컴파일 dSYM파일을 다운로드 할 수 있다.

주문형 리소스(iOS, tvOS)

: 키워드로 태그를 지정하고 태그별로 그룹으로 요청할 수 있는 이미지 및 사운드와 같은 리소스이다. 앱스토어는 애플 서버의 리소스를 호스팅하고 다운로드를 관리한다. 또한 앱스토어는 주문형 리소스를 분할하여 앱 변형을 더욱 최적화한다.

쉽게 말해서 필요할 때 다운로드를 받는 것.

주문형 리소스는 더 나은 사용자 경험을 제공한다.

  • 앱 크기가 작아서 앱 다운로드 속도가 빨라져 최초 실행 경험이 향상된다.
  • 사용자가 앱을 탐색하는 동안 필요에 따라 주문형 리소스가 백그라운드에서 다운로드된다.
  • 운영 체제는 더 이상 필요하지 않고 디스크 공간이 부족할 때 주문형 리소스를 제거한다.
    예를 들어 앱은 리소스를 수준으로 나누고 앱에서 사용자가 해당 수준으로 이동할 것으로 예상하는 경우에만 다음 수준의 리소스를 요청할 수 있다. 마찬가지로, 앱은 사용자가 해당 인앱 구매를 할 때만 인앱 구매 리소스를 요청할 수 있다.

참고
앱을 등록된 장치(앱스토어 외부)에 배포하는 경우 주문형 리소스를 직접 호스팅해야 한다.

What is app thinning?


Convenience init에 대해 설명하시오.

: 보조 이니셜라이저, 말 그대로 보조이기 때문에 기본 이니셜라이저가 있어야만 사용 가능하다.

프로퍼티 중 일부만 초기화할 경우 혹은 프로퍼티의 일부는 기본 값을 지정하고 싶을 경우에 사용할 수 있다.

Designated initializer (지정 초기화)

  • 클래스의 모든 프로퍼티를 초기화 해야함
  • 클래스 타입은 반드시 한 개 이상의 지정 초기화가 필요

Convenience initializer (편의 초기화)

  • 옵셔널
  • Convenience initializer 내부에서 반드시 Designated init이 호출되어야 함 (self.init(abc))

초기화 규칙

  • 자신의 클래스의 모든 멤버가 초기화 되어야한다는 보장
    Designated init: 반드시 바로 위 super class의 Designated init을 호출해야된다.
  • super class로부터 상속받은 멤버들을 super class의 designated init 을 호출함으로서 모두 초기화
    - super class의 designated init호출 전에 자신의 멤버 먼저 초기화
    • super class로부터 상속받은 멤버를 초기화 할 때, super class의 Designated init을 먼저 호출한다.
      그렇지 않으면 super class의 Designated init으로 인해 다시 값이 덮어씌워질 위험
    • Convenience init도 마찬가지로 Designated init 호출 후 별도의 값 대입 가능
    • 초기화 중에는 instance method와 instance property 사용 불가

초기화 원리 이해

1단계 - 등산 (모든 멤버 초기화)

  • 클래스의 init 호출
  • 클래스 인스턴스에 대한 메모리 할당 (아직 초기화 안됨)
  • sub class의 멤버들 모두 Designated로 초기화 (상속받은 멤버들은 아직 초기화 X)
  • 위에서 Designated init은 super class의 Designated init도 호출 (상속받은 멤버들 초기화)
  • Root class까지 연쇄적으로 진행
  • Root까지 가게되면 모든 멤버의 초기화 완료

2단계 - 하강 (상속받은 멤버들에 대한 customizing)

  • Root class에서 다시 sub class로 한 단계씩 차례대로 하강
  • sub class로 내려오면서, super class의 Designated init을 호출한 시점으로 복귀
  • 해당 단계에서 상속받은 멤버에 대한 customizing이 가능
  • 최하위 sub class까지 하강
  • 모든 클래스의 customizing 완료

초기화 자동 상속 - 모든 멤버가 초기화 되어야하므로 제약이 따른다.

  • 모든 신규 멤버들에 디폴트 값이 있으면 자동 상속 o
  • sub class가 Designated init을 하나도 정의하지 않았으면 자동 상속 o
    (Designated init이 하나라도 존재하면 super class의 init 전부 자동 상속 x)
  • super class의 Designated init을 모두 상속 받거나, 작성하면 Conveniience init은 자동 상속 o

required init

required 키워드가 init앞에 붙으면, 모든 sub class들이 명시적으로 해당 초기화를 구현
(required를 붙이면 상속의 의미가 이미 있으므로, override키워드는 붙이지 않음)
Designated init과 Convenience init의 차이
initializer


AnyObject에 대해 설명하시오.

  • Any: 함수 타입을 포함하여 모든 타입의 인스터스
    value 타입(구조체, 열거형), Reference 타입(클래스, 클로저)이건 상관 없이 저장이 가능하다.
    한마디로, Any는 모든 타입 포함할 수 있는 범용 타입이다.
  • AnyObject: 모든 클래스 타입의 인스턴스를 AnyObject라고 한다.

Swift는 특정하지 않은 타입에 대해 동작하도록 특별한 타입 Any, AnyObject를 제공한다.

사용하려면 AnyObjcet로 타입 캐스팅을 해주어야한다.

장점
상속관계가 아니어도 타입 캐스팅이 가능하다.

Any, AnyObject의 타입 캐스팅 ( 단점 )
이 두 가지는 매 번 타입 체크 및 형변환을 해야하기 때문에 필요에 의한 것이 아니라면 사용하지 않는 것이 좋다.
그럼에도 불구하고 사용한다면 switch문을 활용하여 각 타입마다 as?, as!를 통해 다운 캐스팅이 성공하는 case문을 만들어준다.

Any와 AnyObject의 차이

profile
iOS 꿈나무 개발자
post-custom-banner

0개의 댓글