사실 평소에 nib, xib많이 보았다, 심지어 awakeFromNib였나 이것도 보고 CustomViewController를 위한 init메소드안에서도 보았다, 하지만 평소에 나는 절대 스토리보드로 UI를 구성할 일이 없고 항상 코드로만 작성할꺼니까 굳이 알 필요없을꺼야하면서 넘겼던적이 많다, 하지만 이번에 required init(coder:)에 관해 공부해보면서 이렇게된거 한번 정리해서 공부해보자라는 생각이 들어 이렇게 글을 쓴다
-> Xcode 에서 인터페이스 빌더로 만드는 모든 UI 구성요소는 XIB 파일 형태로 만들어진다
그리고 앱을 실행시키면 NIB 파일이 로드되고 내부의 객체들이 인스턴스화 되면서 NIB 파일 내부의 각 객체들은 initWithcoder: 메시지를 받게 된다. 그래서 인터페이스 빌더에서 사용하게 되는 모든 UIView 상속 클래스는 init(coder:) 가 호출되는 것이다. 이후 모든 객체들의 초기화가 끝나고 outlet, action 과의 connection 까지 끝나면 각 객체의 awakefromnib 메시지를 보내어 오버라이드한 awakefromnib가 호출된다.
-> 기본적으로 Xib파일은 xml기반, Nib는 바이너리기반파일이고 Xib파일이 빌드되면은 컴파일에 의해 Nib파일로 변경되며 Xib파일로 있다가 빌드될때 변경되는 이유는 Xib형태가 소스컨트롤에 유리하기때문이다
xib가 "플랫 파일"에 저장된다는 점을 제외하고는 nib과 기능적으로 동일
(flat file : 플랫파일(flat file)은 아무런 구조적 상호관계가 없는 레코드들이 들어 있는 파일)
xib는 Bundle이 아닌 플랫 파일이기 때문에, SCM(source control management : 소스 제어 관리)시스템을 보다 쉽게 처리할 수 있다고 해요.(=xib가 소스컨트롤에 친숙함)
그리고, 빌드를 하면, xib가 앱에 포함될 nib파일로 컴파일이 된다고 합니다.
출처: https://zeddios.tistory.com/298 [ZeddiOS]
뷰 정보를 담고 있는 XIB파일을 빌드하게 되면, 접근하기 쉬운 바이너리 NIB파일로 컴파일 되고, 앱의 번들(앱 실행에 사용되는 파일이 저장된 폴더)로 복사된 후 실행파일에서 사용됩니다
-> 생각해보니까 내가 여태 코드로 tableView나 collectionView에 register메소드를 이용해서 CustomCell을 등록하고자할때 항상 nib혹은 AnyClass를 첫번째 인자로 받고있었는데 나는 항상 CustomCell.self이라고 사용한것으로 보아서 AnyClass에 대한 인자로 넣었던것이였고 따로 CustomCell.xib파일을 생성할 수 있으니까 이를 생성하고 UINib를 통해서 만들어준 nib파일또한 register메소드의 첫번째 인자로 넣을수있겠구나 ㅇㅇ