2

の戻りタイプをチェックして、NSInvocationそれがオブジェクトであるかどうかを確認する必要があります(そこから、オブジェクトisKindOfClass:の正確な種類をチェックするために使用できます)。がNSInvocationありNSMethodSignature、次にがありmethodReturnTypeます。ただし、ドキュメントには次の警告があります。

このエンコーディングは実装固有であるため、アプリケーションは注意して使用する必要があります。

では、リターンタイプがオブジェクトであるかどうかを安全に確認するにはどうすればよいですか?のデコードバリアントはあり@encode(type-name)ますか?

4

1 に答える 1

4

要するに、あなたはできません。少なくとも、100%忠実ではありません。

double、float、int、idsなどの単純な型の場合、戻り型を確認して、プラットフォーム固有の方法で処理できます。より複雑なタイプ(構造体、C ++オブジェクトなど)の場合、C ABIがABIごとにデータをどのように正確にレイアウトするかを理解しようとする道をたどることができますが、その過程でコンパイラを再発明することになります。

幸いなことに、これらすべてがどのように機能するかについて、いくつかの非常に包括的な例があります。PyObjCプロジェクトとRubyCocoa(MacRuby)プロジェクトはどちらもオープンソースであり、任意の戻り値を比較的完全にサポートしています。比較的; あなたはまだ複雑なタイプに夢中になるでしょう。

全体として、Objective-Cはディスパッチ時に純粋に動的ですが、引数の受け渡しと戻り値に関しては、Cから派生した静的言語です。


あなたの最後の文を逃した。ダープはコーヒーの前に強いです。

これは、によって返される可能性のある文字のセットですmethodReturnType

あなたは探しているでしょう@。をmethodReturnType返す場合、オブジェクトの戻り型が単なる;const char *以上のものを返す場合があります。@修飾子が付いている場合があります。メソッドのリターンタイプのボートロードをテストして、それが実際に当てはまるかどうかを確認する必要があります(メタデータの生成は何年にもわたって変更されており、メソッド宣言でのさまざまなキーワードの使用によっても影響を受けます)。

ただし、ほとんどの @場合、これはオブジェクトの戻り型であると結論付けるのに十分です。 Mostあなた自身の宣言のメソッドの真実性が増します(コンパイラの観点から、あなたが極端に奇妙なことをしないことを願っています)。

于 2012-10-10T16:07:41.663 に答える