2009-08-13 10 views
2

iPhone用にThree20を使用していますが、クラスカテゴリを使用してその中でメソッドの動作を変更しようとしています。それはうまくコンパイルされますが、決してブレークポイントに達しません。objective-cスタティックライブラリクラスカテゴリ、オーバーライドメソッドが機能しない

クラスのカテゴリがクラスのすべてのインスタンスに影響すると仮定しているため、静的ライブラリを再コンパイルする必要はありません。

また、コンパイラが失敗し、カテゴリを実装して実装するときにクラス名の末尾に「x」を追加すると、カテゴリに使用しているクラスが表示されていることも知っています。

ここのガイダンスは非常に高く評価されています。

答えて

11

hereが指摘しているように、カテゴリをiPhone OS 3.0の静的ライブラリにリンクさせるには、アプリケーションのその他のリンカフラグに-all_loadオプションを設定する必要があります。 -ObjCもこのトリックを行うべきですが、現在のSDKでは機能しません。 Xcode 4.2のLLVMコンパイラでは、-ObjCのOther Linker Flagが正しく動作しないようにリンカのバグを修正したので、-all_load(いくつかの厄介な副作用があります)を使用する必要はなくなりました。 -ObjCは、静的ライブラリからカテゴリを取得するために必要なものでなければなりません。

これはあなたの問題に寄与している可能性がありますが、私はThree20はそれらのフラグをアプリケーションに正しくリンクするためにこれらのリンカーフラグを設定する必要があると考えています。

+0

ええ、すでにそのフラグがあります、ありがとう。 – Brenden

+0

+1 -all_loadフラグは、すでに-ObjCが設定されていたにもかかわらず、同様の問題(同じではない)を助けてくれました。 – Felixyz

0

2つのカテゴリが同じバイナリ内の同じクラスの同じメソッドをオーバーライドする場合、どのオーバーライドが優先されるかは定義されていません。最良の結果を得るには、サブクラスを作成し、そのメソッドをオーバーライドします。また、Three20はApacheライセンスを取得しているため、ライブラリ自体を変更することもできます。

+0

私はライブラリを変更することができますが、すばやく修正することを望んでいましたが、スタティックライブラリを再コンパイルする方法を調べる必要はありません。ありがとう。 – Brenden

+0

本当に速い修正は、実行時にメソッドを置き換えるために、method_(get | set)実装を使うことでしょう。 – rpetrich

0

私は静的ライブラリにリンクしているプロジェクトを持っていますが、3.0 SDKでデバイスにインストールする場合は-all_loadフラグが必要です。 -ObjCは、シミュレータに必要なものすべてでした。