2017-05-20 7 views
1

私のコードを、id<protocol>のタイプのアプリケーションオブジェクトに返すフレームワークとリンクしています。しかし、私は彼らがどんなクラスであるか分からない。 プログラム内のオブジェクトに送信されたメッセージを傍受する方法がありますか(例えば、メッセージをAと傍受したいのにメッセージBを選択したいなど) 私はmethod_exchangeImplementationsを使って考えましたが、クラスを知る必要があり、わからないので、私にとっては役に立たないようです。id <protocol>オブジェクトへの呼び出しを代行するにはどうすればよいですか?

+0

自分のクラスで返されているオブジェクトをラップして、プロトコルも実装できますか? –

+0

これは私が現在行っている方法ですが、完璧ではありません。目的ID は、オブジェクトID を返すことができるオブジェクトID を返すことができます。そして、例えばid も傍受したいと思っています。この提案ソリューションでは、すべての作成方法を傍受してカスタムオブジェクトを返さなければなりません。何かクリーナーがあるかどうか疑問に思っていた。 – sramij

+0

あなたは呼び出しを傍受することができる代わりのオプションを使用してこのアスペクトライブラリを使用することができます。https://github.com/steipete/Aspects –

答えて

1

id<protocol>手段、文字通り、それはプロトコル@requiredメソッドに応答すること以外に保証され、このオブジェクトについては何もありません。

式のid部分のカスタマイズされた動作に依存すると、脆弱で保守が難しいコードベースが保証されます。フレームワークが変わるたびに、成功と失敗の両方のケースについて完全な資格を取得しなければならず、そのフレームワークの振る舞いの解釈が正しいままであることを確認する必要があります。そして、もしあなたが上記のフレームワークへの情報源を持っていなければ、あなたはブラックボックス・スルーシングの大部分を占めています。

だから、しないでください。テストハーネスを作成している場合や、高度なデバッグを行っている場合を除きます。非常に便利です。

@simple_codeには、Aspectsライブラリが記載されていますので、ここから始めるのが最適です。あなたが受け取ろうとしているもののタイプを知らないので、おそらくisKindOfClass:を使っていくつかのタイプの曖昧さ回避を行う必要がありますが、やはりそのパスを辿っていくことは、フレームワークの依存性実装の詳細(インタフェースだけでなく)は変更されません。

関連する問題