본문 바로가기

iOS/Apple Documentation Archive

Framework Programming Guide

이 포스트는 Apple Documentation Archive 중 Framework Programming Guide 정리한 포스트입니다.

 

 

What are Frameworks?

아래 항목들을 단일 패키지로 캡슐화하는 계증적 디렉토리입니다.

 

  • dynamic shared library
  • nib files
  • image files
  • localized strings
  • header files
  • reference documentation

프레임워크는 정적 링크 라이브러리 및 기타 유형의 동적 공유 라이브러리에 비해 다음과 같은 장점을 제공합니다.

1. 프레임 워크는 서로 관련되어있는 별도의 리소스를 그룹화합니다.

이 그룹화를 통해 해당 자원을 보다 쉽게 ​​설치, 설치 제거 및 찾을 수 있습니다.

 

2. 프레임워크는 라이브러리보다 다양한 자원 유형을 포함 할 수 있습니다.

프레임워크에는 관련 헤더 파일 및 문서가 포함될 수 있습니다.


3. 동일한 번들에 여러 버전의 프레임워크가 포함될 수 있습니다.

이를 통해 이전 프로그램과의 하위 호환성이 가능합니다.


4. 프레임워크의 읽기 전용 리소스 사본은 해당 리소스를 사용하는 프로세스 수에 관계없이 주어진 시간에 물리적으로 메모리에 상주합니다.

이렇게 리소스를 공유하면 시스템의 메모리 사용량이 줄어들고 성능이 향상됩니다

 

 

Anatomy of Framework Bundles

프레임워크는 bundle structure로 패키지됩니다. 프레임워크 번들 디렉토리는 .framework 확장명으로 끝나며, 대부분의 다른 번들 유형과 달리 프레임 워크 번들은 파일이 아닌 디렉토리로 사용자에게 표시됩니다. 이 개방성을 통해 개발자는 프레임 워크에 포함 된 헤더 파일 및 문서를 쉽게 탐색 할 수 있습니다.

 

Framework Bundle Structure

Listing 1  A simple framework bundle

 

Listing 2  A framework with multiple versions

 

 

Listing 3  A framework with additional resource types

Table 1  Standard directories for frameworks

Directory Description
Headers 외부 개발자가 사용할 수있는 공개 헤더가 포함되어 있습니다.
Documentation 프레임워크 인터페이스를 설명하는 HTML 또는 PDF 파일이 포함되어 있습니다. 
Libraries 프레임워크에 필요한 secondary 동적 라이브러리가 포함되어 있습니다.

 

 

Framework Configuration

프레임워크에는 다른 유형의 번들과 동일한 종류의 구성이 필요합니다.

 

Table 2  Framework configuration keys

 

Umbrella Framework Bundle Structure

이 포스트는 Umbrella Framework 에 대해서는 자세히 다루지 않습니다. 

자세한 내용은 여기에서 확인해 주세요.

 

Framework Versions

호환되지 않는 Major

호환되는 Minor의 두 가지 버전이 있습니다

 

Table 1  Making changes to a framework

Version type Changes Allowed What to do
Major version

 

인터페이스 (클래스, 함수, 메소드 등)를 제거.인터페이스 이름 변경.

클래스 또는 구조의 레이아웃을 변경

클래스의 인스턴스 변수를 추가, 변경 또는 재정렬.

C ++ 클래스에서 가상 메소드를 추가 및 재정렬.

함수 또는 메소드의 signature을 변경.

C ++ 컴파일러 또는 컴파일러 버전 변경

Major 버전 변경

Minor version

(public interface changes)

 

C ++ 또는 Objective-C 클래스를 추가. Objective-C 클래스에 메소드를 추가.

non-virtual 메소드를 C ++ 클래스에 추가.

Structure 및 함수 추가 

 

현재 버전 번호 증가

호환성 버전 번호를 일치하도록 설정

Minor version

(no public interface changes)

 

공용 인터페이스에 영향을 미치지 않는 버그를 수정.

공용 인터페이스에 영향을 미치지 않는 기능 향상.

private 인터페이스 변경

현재 버전 번호 증가

호환성 버전 번호를 변경하지 않음

 

Frameworks and Binding

Mach-O 라이브러리의 동적 바인딩은 OS X에 상당한 성능과 유연성을 제공합니다.

동적 바인딩을 통해 프레임 워크는 애플리케이션을 다시 링크하지 않고도 투명하게 업데이트 할 수 있습니다.

런타임시 라이브러리 코드의 하나의 사본을 사용하는 모든 프로세스에서 공유되므로 메모리 사용량이 줄어들고 시스템 성능이 향상됩니다.

 

 

Symbol Binding

정적 링크 공유 라이브러리는 라이브러리의 심볼이 Link time에 존재하는지 확인합니다. 존재하지 않으면 링크 오류가 발생합니다. 

동적 공유 라이브러리는 프로그램이 실행될 때까지 정의되지 않은 심볼의 바인딩이 지연됩니다.

더 중요한 것은 Link editor resolves는 프로그램에서 Symbol를 참조 할 때만 정의되지 않은 각 Symbol를 해석합니다.

Symbol이 참조되지 않으면 프로그램에 바인딩되지 않습니다.

런타임에 Symbol을 바인딩하는 기능은 Mach-O 동적 공유 라이브러리의 내부 구조로 가능합니다.

소스 모듈의 코드가 단일 모듈로 병합되지 않습니다. 런타임시 Link editor resolves는 필요한 경우에만 모듈을 자동으로 로드하고 링크합니다.  다시 말해, 모듈은 프로그램이 해당 모듈의 Symbol를 참조 할 때만 연결됩니다. 

 

 

그림 1은이 'lazy linking'동작을 보여줍니다.

라이브러리 a.o는 라이브러리 함수 a가 호출 될 때 프로그램의 기본 루틴에서 링크됩니다.

프로그램 함수 doThat() 라이브러리 함수 b가 호출되면 모듈 b.o가 링크됩니다.

모듈 c.o는 함수가 호출되지 않기 때문에 연결되지 않습니다.

 

Figure 1   Lazy linking of dynamic shared library modules

 

Guidelines for Creating Frameworks

API Naming Guidelines

두 개의 서로 다른 프레임 워크가 동일한 이름의 심볼을 정의한다고 가정합니다.

두 프레임 워크가 모두 포함 된 프로젝트를 작성하는 경우 해당 심볼를 참조하면 정적 링크 오류가 발생합니다.


모든 외부 심볼 이름에 짧은 prefix를 추가하십시오.

예를 들어, Core Graphics 프레임 워크의 함수는 접두사“CG”를 사용합니다.

 

자세한 내용은 여기를 참조해주세요.

 

Including Frameworks

#include 지시문을 사용하여 코드에 프레임 워크 헤더 파일을 포함시킵니다.

 

Swift: 

 

Headers and Performance

마스터 헤더 파일을 포함하면 프로그램이 부풀려는 우려는 하지 않아도 됩니다.

해당 인터페이스의 코드는 실행 파일이 아닌 동적 공유 라이브러리에 있기 때문에 성능에 영향은 없습니다.

 

참조: 

https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183-SW1

https://devmjun.github.io/archive/FrameworkVsLibrary