2013-08-17 2 views
16

私はメソッドスウィズルを使用して、いくつかの追加機能を持つクラス内のすべてのメソッド呼び出しをラップしていました。具体的に私がいた: NSProxyとNSObject

  • は、キャッシュがそのオブジェクトはそれを返していた場合は、このメソッドの呼び出しのために必要なオブジェクトがキャッシュ
  • にあったかどうかの確認します。
  • そうでない場合は、元の実装にディスパッチし、キャッシュにデータを格納して返します。

それぞれの方法について、私はアドバイスされた方法にリロードします。 +(BOOL)resolveInstanceMethod:(SEL)selとIMP_implementationWithBlockを使用して新しいメソッドを実装します。

正常に動作しましたが、コードがうまく読み込めませんでした。 NSProxyはこの機能を実装するうえでより良い方法を提供するようです。

さらに別の方法として、ターゲットオブジェクトのメソッドの周りにNSObjectサブクラスのスタンドインとインターセプトのメソッド呼び出しを置くだけです。 forwardInvocationとmethodSignatureForSelectorをオーバーライドすることで、私は必要な結果を得ることができます。

NSProxyは私に何を与えるのですか?なぜ私は代わりにこれを使うべきですか?

答えて

12

NSProxyのポイントはほとんどの方法を実装していないことです。これはObjective-C転送機構が起動するようにするために必要です。 NSObjectで始まる場合は、転送する機会がなくてもすぐに直接発送される方法がたくさんあります。

+2

もっと具体的になることができますか?どんな状況下で?私はプロキシを実装していて、NSProxyを拡張するかどうかにかかわらず動作します。 –

+0

'NSObject'のインターフェースを見てください。 'NSProxy'で定義されておらず、あなたのプロキシクラスによってオーバーライドされていないメソッドも転送されません。 'NSObject'(インフォーマルなプロトコルではなく、実装を持つもの)のすべてのカテゴリも考慮してください。その一例は '-classForCoder'と友人かもしれません。プロキシクラスにラップされた 'NSString'をアーカイブしようとするとどうなりますか? –

+0

ああ。 。私はそれがちょうど-methodSignatureForSelector –