branch10480’s blog

Topics that I've learned.

iOSにおけるFrameworkとLibraryについて知ったこと (前半)

iOSDCのFraneworkやLibraryについての動画があったので視聴しつつまとめてみました!(今回は前半です)

f:id:branch10480:20200818200900p:plain

Framework と Library の違い

バンドルを持つか、持たないかで来まる。

Framework: バンドルを持つ Library : バンドルを持たない

バンドルとは?

開発を便利にするために、一定のルールに従ったディレクトリ構造を持つものを指す。 ディレクトリだが、ファイルとして扱える。

特定の拡張子のディレクトリはバンドルとして扱われる。

  • Appバンドル
  • Projectバンドル
  • Settingsバンドル
  • Frameworkバンドル

スタティックとダイナミック

リンクの方式の違い。
静的リンクと動的リンク。

スタティックリンク

通常のソースコードはコンパイルされてスタティックリンクされる。
スタティックリンクされると実行ファイルはまとめられて1つのバイナリになる。

ダイナミックリンク

通常のソースコードはコンパイルされてダイナミックリンクされる。
ダイナミックライブラリは1つにまとめられずにそのまま残り、実行時まで読み込みが遅延される。

リンクだけされて実行時に読み込まれる形式なので、複数のターゲットから1つのライブラリを読み込めるのでシンボル衝突について考えなくて良い。

スタティックかダイナミックかを調べるときは?

fileコマンドで可能だそうです。

file {フレームワーク名}

インポートとは?

  • 外部ライブラリ(自分が書いたコード以外)を自分のコードベースで利用可能にする構文・言語機能
  • ライブラリが公開しているシンボル(クラス・関数など)を自分のコードで参照できるようにする
  • 各ファイル(コンパイル単位)をコンパイルする時点で解決される

リンクとは?

  • ソースコードをコンパイルして生成されたオブジェクトファイル、及び外部ライブラリをすべて連結(リンク)して1つの実行形式ファイル、あるいはライブラリを生成する。
  • リンカという専用のソフトウェアが行う
  • すべてのソースコードをコンパイルした後に行われる
  • スタティック・ダイナミックに関わらず、すべてのシンボルが解決される

今回のまとめ

動画を見つつまとめてみましたが、疲れてきたのでここまでにします。←

普段 Cocoapods や Carthage でライブラリを使っていましたが、コード上で使えるようになるまでの設定についてはさっぱりでした。。ですが知識がついてきた感じがあります。

後半は自分にとっては難しいと感じる内容だったので、時間をおいてまたじっくり見つつまとめたいと思います!

ではでは!

参考

iOSDC Japan 2019: ライブラリのインポートとリンクの仕組み… / Kishikawa Katsumi