1

Core Data でカテゴリを使用しています。私が読んだチュートリアルや聞いた講義のいくつかでは、カテゴリはしばしば「悪い」習慣と見なされていると述べています。しかし、Objective-C は非常に動的であるため、特にクラスのパブリック プロパティしか使用できないため、別の場所でメソッドを定義してもまったく問題ないように思われます。カテゴリを使用する際に注意すべき落とし穴は何ですか? それとも、カテゴリが実際に悪い習慣である何らかの理由がありますか? サブクラスを再生成するたびにアドオン メソッドを書き直さないようにするためです。

4

1 に答える 1

6

私が考えることができる唯一の「危険」は、サブクラス化ではなく、元のクラスのメソッドを置き換えるためにそれらを使用する場合です。

これを行うと、元の実装にアクセスできなくなります。これは通常、オーバーライドするプライベート メソッドであるため、予期しない影響を与える可能性があります。

カテゴリを使用して特定のクラスの任意のオブジェクトに追加のメソッドを追加することは素晴らしいことであり、まさにその目的です。あなたが行っているように、それらをコアデータに使用しても問題ありません。これにより、モデルを変更して、余分なコードを破壊することなく「バニラ」オブジェクトを再生成できるからです。

Apple からのこのドキュメントについては、@CodaFi に感謝します。

現在、Objective-C 言語では、カテゴリを使用して、クラスが継承するメソッドをオーバーライドしたり、クラス インターフェイスで宣言されたメソッドをオーバーライドしたりすることができますが、そうしないことを強くお勧めします。カテゴリはサブクラスの代わりではありません。カテゴリを使用してメソッドをオーバーライドすることには、いくつかの重大な欠点があります。

カテゴリが継承されたメソッドをオーバーライドする場合、カテゴリ内のメソッドは、通常どおり、スーパーへのメッセージを介して継承された実装を呼び出すことができます。ただし、カテゴリがそのカテゴリのクラスに存在するメソッドをオーバーライドする場合、元の実装を呼び出す方法はありません。

カテゴリは、同じクラスの別のカテゴリで宣言されたメソッドを確実にオーバーライドすることはできません。

Cocoa クラスの多くはカテゴリを使用して実装されているため、この問題は特に重要です。オーバーライドしようとするフレームワーク定義のメソッド自体がカテゴリに実装されている可能性があるため、どの実装が優先されるかは定義されていません。

一部のカテゴリ メソッドが存在するだけで、すべてのフレームワークで動作が変化する可能性があります。たとえば、NSObject のカテゴリで windowWillClose: デリゲート メソッドをオーバーライドすると、プログラム内のすべてのウィンドウ デリゲートがカテゴリ メソッドを使用して応答します。NSWindow のすべてのインスタンスの動作が変わる可能性があります。フレームワーク クラスにカテゴリを追加すると、不可解な動作の変化が発生し、クラッシュする可能性があります。

于 2012-07-05T14:13:36.173 に答える