[iPhoneアプリ開発]自作Frameworkをつくる(第7回 リンカフラグ)

[iPhoneアプリ開発]自作Frameworkをつくる シリーズ(Xcode 4.6対応)
第1回 プロジェクトを作る
第2回 Property Listを作る
第3回 Command Line Tools
第4回 Targetを作る
第5回 Workspaceを作る
第6回 Frameworkを完成させる
《今回》第7回 リンカフラグ


前回で“最終回”の予定でしたが、落ちてしまった話題があったので、追加します。
“カテゴリーを使って、既存クラスに機能を追加”していて、“そのファイルをFrameworkで切り出しちゃった場合”、リンカフラグを追加しないと、エラーになります。
今回はこの話です。


1.やるべき作業
アプリケーションのProjectツリーで「Project」をクリックします。

「Target」の「Build Settings」の中に、結構な数の設定項目がありますが、その中にある「Linking > Other Linker Flags」を探します。

ダブルクリックします。

左下の「+」をクリックして、編集可能状態にします。
「-ObjC」と「-all_load」をそれぞれ入力します。

図のようになれば、OKです。

2.注意事項
手を加えるのは、“アプリケーションの側”です。
Frameworkを読み込んで実行する時に、“アプリケーションの側”で「お前は誰だ?」となってしまうことへの対策です。

3.やらないとどんなエラーになるの?
迷惑なことに、“ビルド時にはエラーが出ない”のです。
それどころか、ちゃんと入力補完されちゃったりします。
しかし、“実行時”に「unrecognized selector sent to class ***」というエラーが出て、「???」となります。
ソースコードを開いて、確認しても、やっぱりちゃんとそのメソッドは入力補完されます。

4.このリンカフラグは何?
ここ(Appleのページへのリンク)に書いてありました。
強制的に、あらかじめ“全てのオブジェクトファイルをロード”させないと、「何を基にして拡張したのか分からない」という事態になるようです。まぁそうでしょうね。

ここ(再掲)の下部に「Important」という欄があるのですが、どうやら、「-ObjC」と「-all_load」を無条件でセットで設定した方が良さそうですね。

The following two tabs change content below.

ロゴスウェア

ロゴスウェア株式会社は、インターネットや情報技術を使って学習に革新的進化をもたらす製品を開発することを目標に、2001年7月に設立されたテクノロジー系ベンチャー企業です。

Comments are closed.