3

テストメソッドで本質的に何も知らないクラスでクラスメソッドを呼び出そうとするという興味深い問題があります。その継承とそれが実装する可能性のあるプロトコルを調べることはできますが、NSInvocation に縛られずにメソッドを呼び出す簡単な方法がわかりません。以下のコードは、大雑把ではありますが、私が抱えている問題を実証しようとしています。

@interface ClassA : NSObject

+ (Class)classIsPartialClassOf;

@end

@implementation ClassA

+ (Class)classIsPartialClassOf {
    return [NSString class];
}

@end

@interface ClassB : NSObject

@end

@implementation ClassB

- (id)init {

    [ClassB testClass:[ClassA class]];

}

+ (void)testClass:(Class)classDecl {

    /* obviously if you know the type you can just call the method */
    [ClassA classIsPartialClassOf];

    /* but in my instance I do not know the type, obviously there are no classmethods to perform selector such as the fictional one below */
    [classDecl performSelector:@selector(classIsPartialClassOf)];

}

@end

実装を取得するためのメソッドはインスタンス バリアントを返すようで、静的クラス自体で起動することはできません。

私の選択肢は呼び出しに限定されていますか、それとも明らかなことを見逃していて、自分自身を蹴る必要がありますか?

よろしくお願いいたします。

4

2 に答える 2

2

何が問題ですか?あなたのコード

[classDecl performSelector:@selector(classIsPartialClassOf)];

動作するはずです。そのまま(簡単に書くと)

[classDecl classIsPartialClassOf];

クラス オブジェクトはオブジェクトです。また、クラス メソッドは、クラス オブジェクトで呼び出される単純なメソッドです。

于 2012-07-30T17:53:33.760 に答える
0

「実装を取得するためのメソッドはインスタンス バリアントを返すようで、静的クラス自体で起動することはできません。」

次に、objc_getMetaClass("ClassName")代わりに使用しobjc_getClassます。クラス オブジェクトは、それ自体がオブジェクトであり、そのメタクラスのインスタンスです。メタクラス オブジェクトを eg に渡すとclass_getMethod()、すべてがうまくいきます。

于 2012-07-30T10:23:28.047 に答える