SWIFT awakeFromNib とinitWithCoderの違い 忘備録

initWithNibName:bundleとは

initWithNibName:bundle:はNSおよびUIViewControllerのメソッドです(CocoaではNSWindowController)。 nibは、実際には、-window(NSWindowController)または-loadView(NS / UIViewController)に応答して後でロードされます。 これは遅延読み込みです。 コントローラのウィンドウまたはビューが必要ない場合、そのnib先は読み込まれず、時間を節約できます。 View Controllerをインスタンス化するときにinitWithNibName:bundle:を送信するだけでよく、View-Controllerサブクラスでカスタムのインスタンス化動作を実装するときにのみオーバーライドする必要があります。 サブクラスがmyViewControllerやinitを定義してinitWithNibName:bundle:をハードコードされた値で送信するなどの便利なコンストラクターのみを追加する場合は、initWithNibName:bundle:もオーバーライドする必要はありません。

initWithCoder

initWithCoder:は、アーカイブをアーカイブ解除するためにアーカイブからアーカイブ解除されたすべてのオブジェクトに送信されるメッセージです。オブジェクトは、アーカイブからすべてのivar値とプロパティ値を読み込むことにより、このメッセージに応答します。

nib先はアーカイブなので、initWithCoder:はnib先のすべての実際のオブジェクトに送信されます。そのような場合、通常、nib先から何も抽出する必要はありません。 Appleの実装は、通常のものをすべて処理します。アーカイブから最初に配置するカスタムプロパティ(encodeWithCoder:内)のみを抽出する必要があるため、カスタムプロパティをnibでエンコードできないため、nibsからデコードする必要はありません。 。

「File's Owner」、「First Responder」、およびその他の特定のオブジェクトは偽のオブジェクトであることに注意してください。それらは実際にはnib先には存在しません。 Xcodeのnibエディターは、これらを負のID番号で表示します。

通常、initWithCoder:をオーバーライドする必要はありません。そうするときは、オブジェクトがどのようにインスタンス化されたか(コードまたはnibからアーカイブ解除された)に関係なく、最初から特定のプロパティ(可変配列またはセットなど)を埋める必要があるオブジェクトがある場合です。

initWithCoder:と1つ以上の非デコード対応物の両方を定義すると、それらの間にコード​​のリスクが高くなります。通常、commonInitメソッドを定義し、そこに通常のものを配置し、両方のinit [WithCoder:]メソッドに[self commonInit]を送信させます(注:スーパーではありません!)。

awakeFromNib

awakeFromNibは、nib内のすべてのオブジェクトが完全にロードされた後にnib内のすべてのオブジェクトに送信されるメッセージであり、そのnib内のすべてのアウトレット接続を再接続します。

いくつかの注意事項があります: これは、すべてのアウトレットが満たされることを意味するものではありません。オブジェクトをロードしたnib先で接続しないものは、そのロードで満たされません。これらのivar / propertiesは空のままです。オブジェクトが別のnib先のファイルの所有者である場合、そのnib先に設定されているアウトレット接続を完了するために、そのnib先をロードする必要があります。同じことは、同じFile's Ownerで2つ以上のnib先をロードする場合にも当てはまります。 2つの別々のnib先でオブジェクトを作成することはできません。両方のnib先をロードすると、2つのオブジェクトが生成されます。 (シングルトンの場合は、キャットファイトが予想されます。) 特定のアウトレットが接続されているnib先からオブジェクトをロードし、それがファイルの所有者であり、同じアウトレットが他の何かに接続されている別のnib先をロードすると、新しい接続が最初の接続をオーバーライドします。同じことは、同じFile's Ownerで2つ以上のnib先をロードする場合にも当てはまります。 Cocoa Touchでは、これは冗長であり、混乱を招く可能性があります(「私のアウトレットが[最初のnib先のオブジェクト]に接続されていないのはなぜですか?」) Cocoaでは、最初のオブジェクトは必ずしも解放されないため、リークが発生する可能性があります。 (Cocoa TouchはKVCを使用してアウトレット接続を埋めますが、Cocoaは使用しませんが、アクセサーを定義する場合はアクセサーを使用します。) Cocoaでは、awakeFromNibはnib内のすべてのオブジェクトとFile's Ownerに送信されます。 Cocoa Touchでは、ファイルの所有者には送信されません。

参照元

Cocoa (API): What is the difference between initWithCoder:, initWithNibName:, and awakeFromNib? - Quora