Nib
下記を読めば ok
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW13
https://qiita.com/takasek/items/3bc284149dcd8aecbf7c
https://medium.com/@bhupendra.trivedi14/understanding-custom-uiview-in-depth-setting-file-owner-vs-custom-class-e2cab4bb9df8
UITableViewCellの場合について
https://stackoverflow.com/questions/7655560/why-does-a-custom-tableviewcell-not-need-the-file-owner
はじめに
深く知りたい場合は、Resource Programming Guide を読むと良さそう。
概要
Nib は、Interface Builder で作成したインタフェースを保存した場合の保存形式。Nib は NeXT Interface Builder の略らしい。Nib ファイルは、ウインドウ、ビュー、コントロール等のアプリケーションのUI、視覚的要素を保持する。一方で、ウインドウやビューを管理するオブジェクトといった非視覚的要素も保持する。
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html
用語
UINib
nib ファイル内のコンテンツを初期化はコストがかかる。そのため、同じ nib ファイルをアプリケーション内で何度もロードする、というのは効率が悪い。UINib は、nib ファイルのラッパーオブジェクトであり、主に nib ファイルのコンテンツをロード後、メモリ上にキャッシュし、何度も nib ファイルがロードされることによるパフォーマンスの悪化を防ぐ役割を持つ。そのほかにも、アプリケーションのメモリ使用量が上昇した場合には、メモリ上のキャッシュを自動的にリリースするようなリソース管理も担っている。
https://developer.apple.com/reference/uikit/uinib
Bundle
ディスク上の Bundle ディレクトリ内に格納されたコードおよびリソースの表現である。Bundle という用語自体は、Apple の文脈ではアプリケーションやフレームワーク、プラグイン等のあらゆるパッケージの抽象表現をさしている。詳細は下記参照だが、特に Bundle.main は現在開いているアプリケーション自体を示す。したがって、その中のリソースである nib ファイルをロードする場合にもよく利用される。
Bundle
Interface Objects
Interface Builder を通して nib ファイルに配置する、ウインドウやメニュー等の視覚要素やコントローラオブジェクト (ViewController 等) 等の非視覚要素などの各種オブジェクトのことを指す用語。ランタイムに nib ファイルのロードされるとインスタンス化される。nib ファイルは最低1つの Interface Object を持つ。
File's Owner
nib ファイルをロードするオブジェクトを示す placeholder
nib ファイル内で最も重要な要素のうちの1つ。Interface Object とは違い、nib ファイルのロード時に作成されない、プレースホルダーとしての役割を持つオブジェクト。Interface Builder 上で予め既存のオブジェクトを指定しておくことができ、nib ファイルのロード時に指定されたオブジェクトと Interface Object との接続が行われる。
これが重要な理由は、これが アプリケーションコードと nib ファイル上の要素との間の主要なリンク だから。このリンクがあることにより、アプリケーションコードから Interface Object を参照できるし、Interface Object からメッセージを受け取ることができるようになる。
First Responder
first responder が配置される placeholder オブジェクト。first responder に action を送信したい場合等に参照される。使い道がよくわからないので後ほど調べる。
xib
WIP
ライフサイクル
nib ファイルの実態は xml なので、アプリケーションコードからそれを読み出してメモリ上に展開するという作業が必要になる。
1. nib ファイル内のオブジェクトグラフをメモリ上にのせる
unarchive はされない
ロード対象の nib ファイルに関連する 画像, 音声リソースもキャッシュにのせる
2. メモリ上のオブジェクトグラフを unarchive し、各種オブジェクトをインスタンス化する
インスタンス化対象のオブジェクトが NSCoding protocol に適合していた場合、init?(coder: NSCoder) が利用される
適合していなかった場合 init が利用される
カスタム View の init(frame:) は、iOS では利用されない
3. インスタンス化したオブジェクトと nib ファイル間の各種コネクション (IBAction, IBOutlet 等) を再構築する
4. インスタンス化したオブジェクトの内、適切な対象の awakeFromNib() が呼び出される
コードから直接ロードされた interface object に対してのみ呼び出される
File's Owner や first responder 等の placeholder オブジェクトに対しては呼び出されない
5. nib ファイル内で Visible at launch time 属性が有効になっていたオブジェクトが画面に表示される
もっとnibを深く知る - Qiita
nib ファイルのロード
Storyboard を利用しておらず、nib ファイルを手動でロードする場合、いくつかの方法がある。
Bundle.main.loadNibNamed
Bundle 経由でロードする
name に nib ファイル名、owner には File's Owner として登録するオブジェクト、option にはオプションを渡す。
code:swift
func loadNibNamed(_ name: String,
owner: Any?,
options: UINib.OptionsKey : Any? = nil) -> Any?
https://developer.apple.com/documentation/foundation/bundle/1618147-loadnibnamed
awakeFromNib
https://developer.apple.com/documentation/uikit/uinib/1614137-instantiate
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/Introduction/Introduction.html#//apple_ref/doc/uid/10000051i-CH1-SW1