[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.

谷中

システム開発チームと検証チームのマネージャー。 「疎結合 小さなクラス 分業制」 を裏スローガンとし、これが実現できてこそ、幸せな開発者人生を過ごせるという確信のもと、上流から設計まで口を挟んだり挟まなかったりしています。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>