Nib란?

YongJunCha·2021년 4월 11일
1

swift

목록 보기
6/18
post-thumbnail

1. NIB란?

Xcode 에서 인터페이스 빌더로 만드는 모든 UI 구성요소는 XIB 파일 형태로 만들어진다. 그리고 컴파일 시 바이너리 형태인 NIB 파일로 바뀌게 된다. (NIB 파일 내에는 인터페이스 빌더에서 만든 모든 'UI 관련 객체 및 속성, 객체 간의 연결 정보'가 포함된다)

그리고 앱을 실행시키면 NIB 파일이 로드되고 내부의 객체들이 인스턴스화 되면서 NIB 파일 내부의 각 객체들은 initWithcoder: 메시지를 받게 된다. 그래서 인터페이스 빌더에서 사용하게 되는 모든 UIView 상속 클래스는 init(coder:) 가 호출되는 것이다. 이후 모든 객체들의 초기화가 끝나고 outlet, action 과의 connection 까지 끝나면 각 객체의 awakefromnib 메시지를 보내어 오버라이드한 awakefromnib가 호출된다.

  1. NIB Load 하는 방법

NIB 를 Load 하는 방법은 2가지가 있다.

여기서 왜 갑자기 XIB가 아니고 NIB 라고 하냐면, XIB를 컴파일 하면 바이너리인 NIB 파일로 바뀌게 된다. 즉, 런타임 중 load 할 때는 XIB 가 아니고 바이너리인 NIB 가 load 된다.

// 1번 방법
if let view = Bundle.main.loadNibNamed(“nibFileName”, owner: self, options: nil)?.first as? UIView {
  // view is ready
}

// 2번 방법
let nib = UINib(nibName: "nibFileName", bundle: nil)
if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView {
  // view is ready
}

두 방법 모두 Bundle ( 실행가능한 코드, 이미지. 사운드, NIB 파일 등의 자원을 포함하고 있는 디렉토리) 에서 NIB 파일을 찾아 load 한다는 점에서는 동일하다. 하지만 1번의 경우 호출될 때마다 번들 내의 NIB 파일을 찾고 이를 load 하여 nib 파일 내의 Top-level-object 들을 배열로 반환해주는 반면, 2번 방법은 UINib 객체에서 번들 내의 NIB 파일을 찾고 이를 메모리에 캐시해두었다가, 이후 런타임에 instantiate (인스턴스화) 하는 경우 바로 꺼내와서 사용한다.

nib 파일을 매번 새로 읽어올 필요가 없기 때문에 2번 방법이 훨씬 더 좋은 퍼포먼스를 보여준다.

문서를 보면 이 과정을 NIB 파일에 Serialized 된 후 런타임에 Deserialized 된다고 표현하는데, 검색해보니 encoding, decoding 정도로 이해하면 된다고 한다.


이 글을 작성하게 된 계기 역시 채팅앱을 만들던 중 메세지 인풋 바를 만들면서 좀 더 깊게 공부해보기로 했다.

0개의 댓글