2012-01-06 11 views
0

NSScrollViewをカテゴリにフリップさせないように拡張しました(デフォルトでは反転されています)。次に、NSScrollViewをInterface Builderでアプリケーションに追加しました。 NSScrollViewが反転されます。ペン先にペンの種類が表示されるのはなぜですか?

どうすればいいですか?プロジェクトのソースファイルにカテゴリを含めません。私はそれだけでコンパイルして、何とか十分であるように思えます。そして、私は安全のために清潔なビルドをしました。

そして最も重要なことは:この動作を変更するにはどうすればよいですか?私は自分のニブが見つけられるすべてのカテゴリを自動的に拾い上げることを望んでいません。一方、時にはそれらを含むことが便利かもしれません。しかし、私はいつもカテゴリをopt-inとして見てきました。オプトインではないようです。

答えて

4

カテゴリはクラス全体に適用されます。あなたのプログラムの中にあるNSScrollView ANYWHEREのすべてのインスタンスが新しい振る舞いを取り上げます。このため、一般に、カテゴリ内の既存のメソッドをオーバーライドすることはお勧めできません。あなた自身のインスタンスだけでなく、すべてののクラスのユーザーに対して、そのメソッドの動作を変更しています。

カテゴリはオプトインでもオプトアウトでもありません。彼らは絶対的かつ優先的です。カテゴリがプログラムにコンパイルされている場合は、すべてのインスタンスが影響を受けます。彼らはオプトインもオプトアウトもできません。新しい動作はランタイムによって強制的に強制されます。カテゴリを使用するときは、それを覚えておいてください。

の動作を一部のインスタンスに変更する場合は、NSScrollViewのサブクラス(UnflippedScrollViewなど)を作成し、そのメソッドをオーバーライドする必要があります。次に、非展開スクロールビューが必要なサブクラスを使用します。

+2

質問から何かを強調するだけです。「プロジェクトのソースファイルに自分のカテゴリを含めません。私は何らかの形でそれをコンパイルするだけで十分です。 "それはまさに正しいことです。あなたのプログラム内にカテゴリが存在し、それがターゲットによって構築されるという唯一の要件であれば、プログラム全体のクラスに影響を与えます。 –

+1

このポイントをさらに拡大するには:既存のメソッドをカテゴリで上書きしないでください。一部のAppleフレームワークメソッドは、それ自体がカテゴリに実装されています。 2つのカテゴリが同じメソッドを実装する場合、その動作は未定義です。オーバーライドは、サブクラスではなく、カテゴリで行う必要があります。カテゴリは新しいメソッドを追加するためのもので、既存のメソッドを上書きしません。 –

+1

ピーターのポイント:カテゴリは、カテゴリがロードされた時点からクラスのすべてのインスタンスに適用されます(既存のインスタンスに効果的に遡及的に適用されます)。これは、動的ライブラリにカテゴリを実装し、手動でロードする場合に重要です。ライブラリをロードすると、クラスが変更されます。重要な点は、原則として、カテゴリはアプリケーションの起動時だけでなく、任意の時点でクラスを変更できるため、カテゴリオーバーライドをさらに非決定的にすることができる点です。 –

関連する問題