2009-07-08 15 views
2

外部ライブラリからクラスを拡張しています。ここに私のコードは次のとおりです。Objective-Cカテゴリインポートの不思議な動作

ヘッダファイル:マネージャ+ MyCategory.h

#import "Manager.h" 
#import "Element.h" 

@interface Manager (myCategory) 
- (Element*) elementWithTag:(NSInteger)tag; 
@end 

実装ファイル:マネージャ+ MyCategory.hファイル

@implementation Manager (myCategory) 

- (Element*) elementWithTag:(NSInteger)tag { 
    ... 
} 

@end 

今ここで私は、このカテゴリを使用する方法です。

#import "Manager+MyCategory.h" 

@implementation myClass 

- (void) myFunction:(NSInteger)tag { 
    Manager* myManager = [[Manager alloc] init]; 
    Element* = [myManager elementWithTag:tag]; 

    ... 

    [myManager release]; 
} 

@end 

コンパイルすると警告は表示されませんが、プログラムを実行すると次のエラーが表示されます。

*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]: 

ヘッダファイル(つまり、マネージャー+ MyCategory.h)正しくインポートが、実装ファイルとのリンクが行われていないように見えています。 #import "Manager + MyCategory **。h **"を私のクラスの#import "Manager + MyCategory **。m **"で置き換えると、正しく動作しています。

私が忘れたものは誰でも説明できますか?ありがとう

答えて

1

カテゴリーは伝統的なUnix 静的ライブラリとうまく動作しません。

この場合、リンカーに-ObjCオプションを渡すことで問題が解決されるようです。

Apple Technical Q&A QA1490がすべて説明しています。私は別々の.mと.hのに私のカテゴリ定義を分離する必要がありました修正するためのXcode 4に

をアップグレードするとき、私はこの問題を持っていた

+0

ありがとう! プロジェクトに-ObjCリンカフラグを追加するだけで正常に動作します – Thomas

4

XcodeのapprorpriateターゲットにManager + MyCategory.mを追加することを忘れてしまったと思います。すべてのシンボルが存在し、適切なヘッダーファイルをインクルードしているためにコンパイラ警告がないため、実行時にelementWithTag:メソッドの実装が欠落しているため、リンカーエラーが発生しません。

+0

良い点!しかし、私はチェックし、マネージャ+ MyCategory.mはターゲットコンパイル元である。とにかくThx – Thomas

+1

もう一つの健全性チェックは決して傷つけません。あなたのManager + MyCategory.mに#errorを投げてみてください。コンパイラが失敗しない場合は、カテゴリがコンパイルされていないことがわかります。 – kperryua

+0

申し訳ありませんが、私は助けになることはできませんでした。私はここに答えを残しておきます。なぜなら、それは将来誰かを助けるかもしれないからです。がんばろう。 –

0

謝罪は、

ちょうどテストのために、あなたはヘッダで宣言され、.mファイルで実装さはextern C関数を追加することができます...コメントとしてこれを追加することができませんでした。テストコード内でこのc関数を呼び出すと、 が未解決の識別子のためにリンカエラーを生成します。

これは、フィードバックがすぐに提供され、ファイルが含まれていない理由についての追加の手がかりを生成する可能性があるため、問題の調査を簡単にすることができます。

時間枠が与えられていれば、これを実行したと仮定しますが、その場合は...ターゲットをきれいにしてXCodeをシャットダウンしてから再度開いてください。私はプロジェクトファイルがメモリ内で壊れて、不思議な動作をさせてしまった。

バーニー

+0

Ooooh !!興味深いことが起こった(私は仕事が面白いとは思っていないが)。 私のカテゴリヘッダにextern c関数を追加し、.mファイルに実装しました。私はテストコードの中でそれを呼び出して、何が正しく動作するかを推測します。外部関数は「elementWithTag」メソッドと同様に呼び出されます。 私は何も理解していないとナットを行っています。 もちろん、ターゲットをきれいにして、XCodeを閉じてもう一度開きます。 ありがとう トーマス – Thomas

+0

extern C関数を削除しても機能しなくなったことを忘れてしまいました。 – Thomas

+0

これはかなり面白いです。 「デッドコードストリップ」を無効にするなど、リンカの設定を調整しようとしましたか?私はこれがリンカ最適化の欠陥のいくつかの種類であると考えています。アップルでバグレポートを開くことは良い考えです。 –

0

- Xcodeの3は、実装とインタフェースがでていると大丈夫に見えました。 Xcode 4はむしろ肛門です。

関連する問題