7

私は、もともと XCode 4.0 でビルドされ、その後 XCode 4.2 を使用するように移行されたプロジェクトに取り組んでいます。今、XCode 4.5 への移行をテストしましたが、以下のような大量の警告が表示されます...

instance method 'values' in category from <pathToTheFile>/HistoryObject+extras.o conflicts with same method from another category

これらの警告は以前のバージョンの XCode では表示されず、コードも変更されていません。

プロジェクトは、Deployment Target として iOS 4.3 に設定されています。

そのため、以前の開発者から、CoreData から自動生成されたと思われる一連の DAO 型クラスがあり、これらの各クラスには、特定のメソッドを実装するためにそれを拡張する Category があります。例を挙げます...

NSManagedObject から継承する LisaObject という名前の基本クラスがあり、LisaObject+extras という名前のカテゴリがあります。LisaObject+extras には、NSMutableDictionary を返す「values」という名前のメソッドがあります。

次に、LisaObject から継承する HistoryObject という名前のクラスがあります。HistroyObject+extras という名前の HistoryObject のカテゴリもあります。このカテゴリには、「値」という名前のメソッドもあります。HistoryObject+extras 値メソッドでは、[super values] を呼び出してから、いくつかの条件をチェックし、基本クラス メソッドでは設定されていない追加の値をディクショナリに設定します。

次に、HistoryObject を継承する LessonStatusObject という名前のクラスがあり、このクラスにも、values という名前のメソッドを持つ、LessonStatusObject+extras という名前のカテゴリがあります。この値メソッドも [super values] を呼び出し、返された辞書に対して追加の作業を行います。

これらの「値」メソッドのそれぞれについて、コンパイル時に上記のような警告が表示されます。ここでは、カテゴリに競合する名前のメソッドがあることを示しています。

これについていくつか質問があります。

まず、この実装は正当な問題を引き起こす可能性がありますか、それともこれらの警告は一般的に無害ですか? この実装が実行時にどのようにあいまいさを引き起こすかを考えてみましたが、それがどのように起こるかわかりません。

第二に、これらの警告を修正するために私がすべきことはありますか (警告が表示されないようにするだけではありません。原因を修正することを意味します)。これについて何か他の方法がありますか?

また、なぜ XCode 4.2 はこれについて警告しないのに、XCode 4.5 は警告するのでしょうか?

カテゴリについて何か誤解していますか? つまり、「values」メソッドが実際に各クラスの実装の一部である場合、私たちのようにそれらをオーバーライドしても問題はありませんが、コンパイラーは単にこれらがカテゴリであるという理由だけで文句を言っているようです。これについて何か危険なことはありますか?

どんなアドバイスでも大歓迎です。

編集:詳細情報を提供するために... XCode 4.2 を使用していたとき、プロジェクトのコンパイラは Apple LLVM Compiler 3.0 に設定されていました。XCode 4.5 でプロジェクトを開くと、コンパイラが Apple LLVM Compiler 4.1 に設定されています。

4

3 に答える 3

4

警告を無視しないでください。

Appleの「Objective-Cによるプログラミング」ガイドの「既存のクラスのカスタマイズ」セクションには、次のように書かれています。

カテゴリで宣言されたメソッドの名前が元のクラスのメソッド、または同じクラス(またはスーパークラス)の別のカテゴリのメソッドと同じである場合、どのメソッド実装がで使用されるかについての動作は定義されていません。ランタイム。

それがあなたのために働いているなら、それは運です。

于 2012-11-14T23:27:21.083 に答える
0

私もこの問題を抱えていましたが、別のことが原因でした。私にとっては、カテゴリが Xcode プロジェクトに 2 回追加されたということでした。メソッドの 1 つの名前を変更しようとして、リファクタリング プレビューでカテゴリ ファイルが 2 回リストされていることを確認するまで、これが事実であることを発見しませんでした。

于 2014-04-30T21:55:35.767 に答える