momodudu.zip
Xcode Modules, Framework, Library 비교 본문
Xcode에서는 framework, static library, dynamic library, bundle을 정의할 수 있다.
1. Library
Library는 image, asset, nibs, string files, visual data와 같은 리소스 파일들을 포함할 수 없다. 그래서 이러한 resource들을 런타임에 인코딩/디코딩 할 수 있는데, 이러한 작업들은 복잡하다. 또한, 라이브러리 외에 번들을 생성해서 번들과 라이브러리를 함께 배포할수도 있다. 단, stand-alone 번들은 iOS에서는 지원하지 않는다. iOS에서는 프레임워크에 포함된 리소스에만 접근할 수 있다.
Library는 static library와 dynamic library로 나뉜다.
- Static Library : 컴파일 타임에 static linker가 static library를 연결한다. resource를 포함할 수 없고, 오로지 코드로만 구성될 수 있다.
- Dynamic Library : 런타임에 dynmaic linker가 dynamic library를 연결한다. resource를 포함할 수 없다. .dylib의 확장자를 가지는 이 dyanmic library는 iOS, watchOS, tvOS에선 지원되지 않는다. 단, Xcode에서 제공하는 Core Data, Core Bluetooth와 같은 Swift Library는 iOS등에서도 지원한다.
2. Framework
framework는 structured directory, bundle이다. framework는 dynamic library를 포함할 수 있다. 또한 nib file, image, header와 같은 리소스 파일도 포함할 수 있다. dynmaic linker는 framework의 dynamic library를 런타임에 연결한다.
framework는 본래 static / dynamic library와 같은 목적으로 만들어졌지만, library와는 다르게 프레임워크는 리소스를 포함할 수 있고, memory에 로딩된 resource data를 한번만 카피하는데, memory 사용량이 줄어들고, iOS app과 extension간에 프레임워크를 공유할 수 있다.
3. Module이 Static인지 Dynamic인지 어떻게 선택할까?
build setting에서 Mach-O Type 필드를 수정할 수 있다. framework의 경우 dyanmic library를 포함하므로, dynamic으로 선택되는데, 원하는경우 static으로 변경할 수 있다고 한다. 이 경우, framework 번들에는 접근할 수 없으며 framework내의 리소스도 사용할 수 없다.
4. Embed or Not Embed
Embedding module은 해당 모듈을 최종 package에 폴더로서 추가한다. 이 폴더를 bundle class를 이용해서 런타임에 접근하여 리소스를 사용할 수 있다. 해당 폴더를 실제로 보려면 프레임워크를 포함하고, 아카이브하면 된다. static library의 경우, 포함하지 않아도 된다. 컴파일타임에 컴파일되고, 링킹되기 때문이다.
5. Performance
앱 startup 성능상으로는, static library가 더 빠르다고 할 수 있다. 컴파일타임에 모두 링킹되고, 런타임에는 필요가 없기 때문이다. 그렇지만 static library는 앱 바이너리 파일 사이즈를 증가시킨다.
'ios' 카테고리의 다른 글
[Swift/Objective-C] Objective-C로 만들어진 헤더파일을 Framework에서 숨기는 방법 (0) | 2020.05.21 |
---|---|
jazzy를 이용해서 swift/objective-C로 작성된 코드 개발 문서 작성 (0) | 2019.12.28 |