프레임워크를 만들다보면 Build Settings -> Mach-O 타입에 따라 프레임워크가 다르게 생성된다.
두개의 프레임워크 타입은 컴파일된 코드를 참조하는 방식에 차이가 있다
Static Framework의 경우, 앱이 사용하는 프레임워크의 코드는 컴파일 시간동안 ‘Static Linker’에 의해 앱의 실행파일 안에 복사된다.

아래는 구글링시 나오는 대략적인 장단점에 대해 적어놓았다.
장점)
1. 앱 실행파일에 직접 Link되어 있으므로 런타임상 속도가 빠르다.
2. 참조가 아닌 코드가 복사되기에 안정적이다.
단점)
1. 메모리를 Dyanamic에 비해 더 차지한다.
Dynamic의 경우, 런타임 상에서 Mach-O 파일과 연결(참조관계)이다.

장점)
1. Framework 내에 이미지나 뷰같은 리소스 파일 혹은 Bundle을 Embeded 할수 있다.
2. 링크를 참조하기에 Static에 비해 메모리가 자유롭다. (필요할때 로드시키기에 Lazy하다.)
3. 빌드 속도가 단축된다 (?)
단점)
1. 디버그시 필요한 dSYM 파일을 프레임워크 개발자가 제공해야함
2. Static에 비해 런타임상 속도가 느리다.
Bundle이란?
하위 디렉토리를 가지고있는 디렉토리이다. (Framework도 bundle의 한 종류) iOS에서 Bundle은 이미지, Xib, 코드와 같은 파일을 하나의 패키지로 제공한다. 또한 시스템에서 Bundle을 하나의 파일로 취급하기에 내부 구조를 몰라도 내부 데이터에 액세스 가능하다.
각 타입마다 Xcode에서 사용 방법
Link Binary With Libraries
Static Framework를 앱 실행파일(바이너리)에 링크된다.
이 경우, 프레임워크 안에 리소스파일이 있더라도 사용할수 없다.
아래 그림에는 ‘Link Binary With Libraries’ 옵션으로 빌드한 앱 내부의 모습이다.

Embed Content
Dynamic Framewokr 혹은 리소스를 담은 번들과 같이 참조할 경우, rpath 경로로 앱 안 폴더에 복사된다.
아래 그림을 보자

Frameworks 라는 폴더안에 넣은 testFramework 파일이 들어가 있는것을 볼수 있다.
(깨알팁으로 ‘Frameworks’ 라는 경로는 Build Settings 에서 rpath 경로를 수정하면 참조하는 디렉토리 이름을 바꿀수 있다. 아래 그림 참고)

호기심 테스트!!
그냥 궁금해서 해보는 테스트
1) Dyanmic framework 생성 후, 프로젝트에 Embed 시키지 않을 경우 ( Link Binary With Libraries 옵션만 사용)
아래와 같은 에러가 발생하며 앱이 실행되지 않음.
dyld: Library not loaded: @rpath/testFramework.framework/testFrameworkReferenced from: /private/var/containers/Bundle/Application/5973F53D-9753–4FA8–9917–6134D76DA5F7/sample.app/sampleReason: image not found
에러가 발생하는 이유!
Dynamic Framework는 런타임상에서 참조가 걸리게 된다. 번들 형태로 앱 안에 존재해야 하는데 embed 시키지 않으므로 앱 안에 존재하지 않는다.
따라서, sample(앱)에 testFramework를 로드할수 없기에 이러한 에러가 발생한다
2) Static / Dynamic 프레임워크 생성시 용량 차이 확인
같은 소스 코드와 Xcode에서 빌드함
Static Framework)

Dynamic Framework)

??? 같은 소스임에도 Mach-O 타입에 따라 용랑이 달라졌다???
정확한 이유는 아직 모르겠습니다…..>
3) 2번에서 생성한 Framework를 둘다 Embeded하여 앱 내부 데이터 용량 확인
Static Fraemwork)

Dynamic Framework)

일단 Static Framework의 아이콘도 달라지고 오히려 용량이 줄어들었다..????? 이것도 이유를 모르겠음…흠 ……… 큰일…
결국 이렇게 되면 Static Framework를 생성하고 그 안에 리소스 파일을 넣는게 훨씬 용량면에서 절약되지 않나라는 생각에 더 검색을 해봤습니다.
거의 정보가 없는 찰나 의존성 매니저인 카르타고에서 발견했다.
If any of your dynamic frameworks contained embedded resources, you may not be able to build them statically. However, you may find success in just copying the resources into the bundle that you’re linking the static frameworks with, but this will not work in all cases.Dynamic Framework의 경우, 리소스를 embed 할수 있지만 static하게 빌드 할수 없다.Static Framework를 연결하는 번들 안에 리소스를 복사하면 성공할수 있지만 모든 케이스에서 작동하지 않는다.참고 : https://github.com/Carthage/Carthage/blob/master/Documentation/StaticFrameworks.md
‘but this will not work in all cases.’ 만 남기고 더이상의 정보는 없다…
제일 발견하기 힘든 될때도 있고 안될때도 있는 그런 여운만 남겼다….
2번, 3번에 아시는 분은 알려주세요 ….
정리
일반적으로 코드상 API만 제공해주는 SDK인 경우 Static Framework를 생성하고 Framework에서 사용하는 리소스가 있다면 Dynamic Framework를 사용한다(물론 Static Framework도 따로 리소스를 포함시키면 사용할수 있음)
프레임워크에 대해 막 찾아봤는데 결국 더 궁금증만 남기게 되었다…
컴파일 속도, 런타임 속도는 간단한 샘플 앱에서 체감될 정도는 아니기에 이 부분도 되게 부족하다고 느낀다… 혹시 이런거 말씀해주실 분 없으신가요 흑
여기까지 부족한 글을 읽어주셔서 감사합니다~