0

それは...ですか:

すべてのプログラムのメソッドを常に RAM に保存する必要がないため、メモリ効率が向上しますか? もしそうなら、これは本当に一般的な問題ですか?新しいメソッドをロードしなければならないオーバーヘッドは、通常サイズのプログラムのメモリ節約を相殺するように感じますが、非常に大きなものにどのように役立つかはわかります.

柔軟性を高めるには?もしそうなら、その例を挙げていただけますか?ひとつ考えるのは難しいと思います。

私はこの質問に対する答えをグーグルで検索しようとしてきましたが、理由ではなくカテゴリの使用方法に関するリソースしか見つけられないようです。あなたの誰かが私を正しい方向に向けることができれば、それは素晴らしいことです.

4

2 に答える 2

5

カテゴリの主な理由は、ソース コードがないクラスやソース コードを変更したくないクラスにメソッドを追加できるようにすることです。

例 1。

UIImageアニメーション GIF を読み込んでアニメーションを作成する方法が必要でした。論理的には、これはUIImageクラス メソッドである必要がありますが、UIKit フレームワーク ( を含む) のソース コードがありませんUIImageUIImageそこで、 という名前のクラス メソッドを追加するためのカテゴリを作成しましanimatedImageWithAnimatedGIFData:た。私のuiimage-from-animated-gifリポジトリで見つけることができます。

このメソッドを に追加する必要がありましたUIImageか? いいえ、通常の C 関数にすることもAnimatedGIFLoader、メソッドを保持するユーティリティ クラス (おそらく という名前) にすることもできました。しかし、設計の観点からは、メソッドは論理的に に属しUIImageます。

例 2。

Apple は、文字列をグラフィック コンテキストに簡単に描画できるようにしたいと考えていました。NSStringGUI を使用するプログラムでは、draw メソッドを使用するのが合理的です。Apple は Foundation フレームワーク ( を含むNSString) のソース コードを持っているので、それを追加することができます。しかし、Foundation フレームワークは、ユーザー インターフェイスを持たないプログラムを含む、あらゆる種類のプログラムで使用できるように設計されています。したがって、Foundation のクラスは、UIKit、AppKit、Core Graphics、またはグラフィックスを描画できるその他の高レベル ライブラリについて何も知りません。

代わりに、UIKit にはdrawAtPoint:withFont:メソッドを に追加するカテゴリがありますNSString。AppKit には、drawAtPoint:withAttributes:メソッドを に追加するカテゴリがありますNSString

AppKit と UIKit には、Foundation クラスにメソッドを追加する他の多くのカテゴリがあります。たとえば、UIKit には 、 、 などのカテゴリがNSObjectありNSIndexPathますNSCoder

.mカテゴリを使用するもう 1 つの理由は、クラスの実装を複数のファイルに分割することです。大きなクラスがある場合は、そのセレクターの一部をカテゴリに移動し、別のソース ファイルにカテゴリ メソッドを実装できます。リンカーは、実行可能ファイルを作成するときにカテゴリをクラスに自動的にマージするため、実行時のペナルティはありません。

于 2012-10-11T02:38:03.950 に答える
0

カテゴリを動的にロードする理由の 1 つは、条件付きでロードすることです。OSの異なるバージョンとの互換性のためにこれを使用しました。

たとえば、システム フレームワークの新しいバージョンには、私が使いたい便利な機能がいくつか用意されています。ただし、以前のバージョンの OS への展開をターゲットにしています。古いバージョンの新しい機能の (部分的な) 置換を実装できますが、新しいバージョンではシステム コードを使用したいと考えています。そのため、新しいメソッドの実装を提供するカテゴリを実装しますが、それは古いシステムにのみロードします。OS の新しいバージョンにロードしないようにする必要があります。ロードすると、システム提供のメソッドがカテゴリに置き換わってしまうからです。

于 2014-07-06T17:58:26.560 に答える