App Thinning, Convenience init, AnyObject

Groot·2022년 11월 6일
0

TIL

목록 보기
95/153
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 면접스터디

📍 App Thinning

  • App Store 및 운영 체제는 최소한의 설치 공간으로 사용자의 특정 장치 및 운영 체제 버전의 기능에 맞게 앱 제공을 조정하여 iOS, tvOS 및 watchOS 앱 설치를 최적화합니다.
  • 앱 씬닝(thinning)이라고 하는 이 최적화를 통해 가장 많은 장치 기능을 사용하고, 최소 디스크 공간을 차지하며, Apple에서 적용할 수 있는 향후 업데이트를 수용하는 앱을 생성할 수 있습니다.
  • 더 빠른 다운로드와 다른 앱과 콘텐츠를 위한 더 많은 공간을 얻을 수 있다.

🔗 Slicing (iOS, tvOS)

  • 앱 하나에 굉장히 많은 art work 및 기타 리소스가 있음
  • 앱에 필요한 것만 담기 위한 방법이 App Slicing
    • App Slicing은 앱이 지원하는 여러 디바이스에 대해 각각 조각 애플리케이션 번들을 생성하고, 해당 디바이스에 가장 적합한 조각을 전달

범용 앱(universal app) 하나를 업로드 하면, 앱스토어에서 슬라이스가 발생 -> 앱스토어가 디바이스의 특성을 보고, 위 그림처럼 필요한것만 조합해서 별도의 IPA를 만든다.

  • IPA 파일에 앱의 압축 데이터가 ZIP

🔗 비트코드(bitcode)

  • Xcode 14부터 비트코드는 더 이상 watchOS 및 tvOS 애플리케이션에 필요하지 않으며 App Store는 더 이상 Xcode 14의 비트코드 제출을 허용하지 않는다.
  • 비트코드는 기계언어로 번역되기 이전 단계의 중간표현(Intermediate Representation)
  • 현재 iOS에서는 옵션이나 기본 설정
  • 비트코드를 사용하여 업로드를 하면 애플이 애플리케이션을 재컴파일하여 앱 바이너리(app binary)를 생성.
  • apple 측에서 32-bit, 64-bit 디바이스별로 필요한 빌드를 다르게 제공해서 용량을 최소화
  • 비트코드를 사용하지 않으면, 모든 경우의 디바이스 경우에 따라 바이너리로 생성하여 합쳐져서 fat binary라는 것이 업로드되지만, 비트코드를 사용하면 필요 경우에 따라 재컴파일하게 되므로 여기에서 최적화할 수 있습니다.

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

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

  • 예시
    - 앱은 리소스를 수준으로 나누고 앱에서 사용자가 해당 수준으로 이동할 것으로 예상하는 경우에만 다음 수준의 리소스를 요청
    - 앱은 사용자가 해당 인앱 구매를 할 때만 인앱 구매 리소스를 요청

  • 이점

      1. 앱 크기가 작아서 앱 다운로드 속도가 빨라져 최초 실행 경험이 향상
      1. 사용자가 앱을 탐색하는 동안 필요에 따라 주문형 리소스가 백그라운드에서 다운로드
      1. 운영 체제는 더 이상 필요하지 않고 디스크 공간이 부족할 때 주문형 리소스를 제거

📍 Convenience init가 무엇인가요?

  • convenience init은 "보조 이니셜라이저", 클래스의 원래 이니셜라이저인 init을 도와주는 역할
  • convenience init은 같은클래스에서 다른 init을 호출해야함, 결론적으로 Designated init을 호출해야함
  • init의 파라미터 중 일부를 기본값을 설정해서, convenience init안에서 init을 호출하여 초기화 진행할 수 있습니다.
  • 편의 이니셜라이저는 항상 위임해야 함.
  • 일반적인 초기화 패턴에 대한 바로 가기가 시간을 절약할 때나 , 클래스 초기화 의도를 더 명확하게 만들 때 편의 이니셜라이저를 만듭니다.
  • init이 모든 프로퍼티를 전달받지 않았을 때? 일부 프로퍼티만 있을 때? 의 상황을 대비하여 에러가 뜨지않게 미리 예약해놓는 느낌의 보조 이니셜라이저

🔗 꼬리질문

  • convenience init 사용예시
    • ??
  • 언제 사용해야 할까요?
    • extension에서 기존 init에 대한 변경이 필요할 때
  • required init
    • required 키워드가 init앞에 붙으면, 모든 sub class들이 명시적으로 해당 초기화를 구현 (required를 붙이면 상속의 의미가 이미 있으므로, override키워드는 붙이지 않음)

📍 AnyObject

  • 타입 캐스팅을 수행할 때 일반적으로 상속 관계에 있는 클래스끼리만 캐스팅이 가능하지만, Any와 AnyObject 타입을 사용할 경우, 상속 관계에 있지 않아도 타입 캐스팅을 할 수 있다
  • 유형 별칭 AnyClass
  • 모든 클래스가 암시적으로 준수하는 프로토콜
  • 형식이 지정되지 않은 개체의 유연성이 필요하거나 형식이 지정되지 않은 결과를 반환하는 브리지된 Objective-C 메서드 및 속성을 사용할 때 AnyObject를 사용
  • AnyObject는 모든 클래스, 클래스 유형 또는 클래스 전용 프로토콜의 인스턴스에 대한 구체적인 유형으로 사용할 수 있다.
    • 다형성
  • AnyObject는 Objective-C 클래스에 연결되는 유형의 인스턴스에 대한 구체적인 유형으로도 사용
  • Objective-C 형식은 속성, 메서드 매개 변수 및 반환 값에 대한 형식으로 AnyObject를 자주 사용
  • 구체적인 유형의 AnyObject가 있는 객체는 특정 동적 유형을 유지하며 유형 캐스트 연산자(as, as? 또는 as!) 중 하나를 사용하여 해당 유형으로 캐스트할 수 있습니다.

🔗 꼬리질문

  • Any는 무엇인가?
    • 모든 타입을 저장할 수 있게 해주는 것
  • Any나 AnyObject의 타입이 결정되는 시점은?
    • 런타임
  • as, as? 또는 as!의 차이

https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f
https://edu.goorm.io/learn/lecture/1141/%EC%95%BC%EA%B3%B0%EC%9D%98-%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/lesson/43387/any-anyobject-nil
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
https://developer.apple.com/documentation/xcode/doing-basic-optimization-to-reduce-your-app-s-size
https://developer.apple.com/documentation/xcode/reducing-your-app-s-size
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083
https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes

profile
I Am Groot

0개의 댓글