0

私には奇妙な仕事があります。目的の c オブジェクトのすべての関数を含む配列を取得する必要があります。次に、各関数がクラス メソッドであるかどうかを判断できるようにする必要があります。次に、各パラメーターの名前 (できれば NSString) と、各パラメーターが取る型を取得する必要があります。これを行う方法はありますか?そうでない場合、NSCoding プロトコル関数 -(void)encodeWithCoder:(NSCoder*)aCoder; でコード化されたキーと値にアクセスする方法を知っている人はいますか? NSKeyedArchiver を使わずに? ここでやろうとしているのは、オブジェクトの初期化に必要なプロパティのリストを表示することです。すべてのオブジェクトは、クラス メソッドを使用して自身を初期化します。オブジェクトごとに異なるプロパティを編集できるレベル エディタを作成していますが、編集していません。

4

1 に答える 1

2

目的の c オブジェクトのすべての関数を含む配列を取得する必要があります。次に、各関数がクラス メソッドであるかどうかを判断できるようにする必要があります。

十分に簡単です: あなたが望むclass_copyMethodList()、そのクラスのインスタンス メソッドだけを取得します。クラス メソッドを取得するには、クラス オブジェクトを渡します。class_copyMethodList(object_getClass([NSString class]), &count);

次に、各パラメーターの名前 (できればNSString) と各パラメーターの型を取得する必要があります。

パラメータ名の部分はおそらく不可能です。それらはメソッドのメタデータには含まれていません。また、コンパイル後はまったく存続しないと確信しています。それらがそこにある場合、それらを実行可能ファイルから掘り出すのは確かに簡単ではありません.

ただし、型には、2 つのランタイム関数のいずれかを介して簡単にアクセスできます。メソッドの戻り値と引数の署名文字列method_getTypeEncoding()を取得する、または引数の型をループできる のいずれかです (返される文字列は、完全なタイプ文字列)。method_getArgumentType()

そうでない場合、を使用せずにNSCodingプロトコル関数でコード化されたキーと値にアクセスする方法を知っている人はいますか?-(void)encodeWithCoder:(NSCoder*)aCoderNSKeyedArchiver

あなたが作った特定の実装について話しているのencodeWithCoder:ですか?によって暗示される ivar のリストが必要[coder encodeObject:firstIvar forKey:@"firstIvar"]; [coder encodeObject:secondIvar forKey:@"secondIvar"];ですか? それがメソッドシグネチャとどう関係するのかはわかりませんが、もしそうなら、コーダーとして渡してオブジェクトNSCoderに送信するときに辞書を作成するサブクラスを作成できます(先日投稿したこの回答を参照してください) .encodeWithCoder:

ここでやろうとしているのは、オブジェクトの初期化に必要なプロパティのリストを表示することです。

プロパティの名前を含む配列を返すクラス メソッドはどうでしょうか。

+ (NSArray *)essentialPropertyNames {
    return [NSArray arrayWithObjects:@"firstIvar", @"secondIvar", nil];
}

おそらく、ランタイム/クラスのメタデータを選択するよりも手間がかからず、それほど奇妙ではありません。

すべてのオブジェクトは、クラス メソッドを使用して自身を初期化します。

それはせいぜい異常に聞こえます。Cocoa では、インスタンスは-init初期化を行うために何らかの形式を使用する必要があります。

于 2012-05-14T02:26:05.457 に答える