본문 바로가기

Mobile/IOS

Static Framework, Dynamic Framework

이 글은 공부하는 것을 정리하는 목적으로 적는 글이오니 건전한 비판은 환영합니다.

 

Static Framework

 

- SDK 형태로 배포하는 경우

- 위의 그림에서 보듯이 Static Linker를 통해 Static Library 코드가 어플리케이션 코드 내로 들어가 Heap 메모리에 상주하게 됩니다. 따라서 Static Library가 복사되므로, Static Framework를 여러 Framework에서 사용하게 되면 코드 중복이 발생하게 됩니다.

 

Static Framework를 사용하게 된다면 코드 중복이 발생하게 된다는 이야기가 너무 헷갈려서 좀 찾아보게 되었습니다.

어떤 예가 있어야 정확하게 이해할 수 있을까?

Static Framework의 코드는 앱의 실행 파일에 직접 포함이 됩니다. 그래서 프레임워크의 모든 코드가 앱의 실행 파일에 복사되므로, 프레임워크를 업데이트를 할 시에 실행 파일 크기가 증가할 수 있습니다.

좀 더 풀어서 이야기 하자면 빌드 타입시에 프레임워크도 한 꺼번에 복사가 되어서 실행되기 때문에 용량이 증가하게 됩니다.

왜냐하면 런타임을 하기 전에 빌드시에 같이 코드와 묶어서 실행이 되기 때문입니다.

그렇기 때문에 Frameworks,Libraries, and Embedded Content에 Do not Embed를 선택해도 됩니다. 왜냐하면 파일이 복사가 되었기 때문이지요.(Bundle과 관련된거면 Embed & Sign으로 해야한다.)

 

Static Framework를 사용했을 때 가질수 있는 이점은 런타임 시에 별드 시간을 가지지 않아서 다이나믹보다 빠를 수 있습니다.

단점은 메모리가 많이 사용되고, 컴파일 속도가 오래 걸리게 됩니다.

 

Dynamic Framework

 

- 일반적으로 리소스를 스스로 가지고 있거나 전체 소스를 제공하는 경우 Dynamic Framework를 사용합니다.

- 위의 그림에서 볼 수 있듯이 주소를 저장하고, Static Linker를 통해서 Stack으로 필요한 라이브러리를 불러와서 사용하는 형태입니다. 주소 정보들은 Heap에 상주해 있습니다.

 

Dynamic의 경우에는 주소 값이 Heap에 있고 런타임시에 필요시에 스택으로 불러와서 사용하기 때문에, 메모리를 효율적으로 사용하게 됩니다. 그래서 Static Framework와 다르게 동적으로 할당이 되다보니, 불필요한 리소스 자원의 낭비가 상대적으로 적습니다.

 

그래서 Dynamic Framework를 사용하는 경우에는 Frameworks,Libraries, and Embedded Content에 Embed & Sign을 선택해야 합니다. 런타임시에 Framework를 사용하기 때문이지요.

 

Dynamic Framework사용시 이점은 제한적인 모바일 환경에서는 코드 중복이 포함되는 상황이 감소되어 저장공간에 유리할 수 있습니다.

단점은 런타임 필요시에 할당되다 보니 느릴 수가 있습니다.

 

 

Reference

https://minsone.github.io/ios/mac/ios-framework-part-1-static-framework-dynamic-framework

 

[iOS][Xcode] Framework Part 1 : Static Framework와 Dynamic Framework

서론 Xcode에서는 Framework 라는 것을 통해 모듈화 단위의 코드 및 리소스를 사용할 수 있습니다. 그리고 외부 소스를 가져다 사용할 때 Cocoapods, Carthage 같은 도구를 사용하거나 혹은 직접 git submodule

minsone.github.io

 

 

https://ios-development.tistory.com/1004

'Mobile > IOS' 카테고리의 다른 글

iOS 커스텀 프레임워크 만들기  (0) 2023.09.18
ViewModel을 이용한 버튼 활성화 방법  (0) 2022.10.18
Objective-c xml 파싱, json 파싱  (0) 2022.08.21
DispatchQueue  (0) 2022.07.01
CocoaPods 에러 Cannot find 'Auth' in scope  (0) 2022.05.04