1

クラスメソッドとセレクターに NSClassFromString と NSSelectorFromString を使用して呼び出しを構築したいと思います。次の方法で呼び出しを構築しようとしました。

NSMethodSignature *signature;
NSInvocation *inv;

Class targetClass = NSClassFromString(@"NSString");
SEL selector   = NSSelectorFromString(@"stringWithString:");
id arg = @"argument";

Method method = class_getInstanceMethod(targetClass, selector); 

// コードを実行するとメソッドが nil になるのはなぜですか?

struct objc_method_description* desc = method_getDescription(method);

if (desc == NULL || desc->name == NULL){
    return nil;
}

signature = [NSMethodSignature signatureWithObjCTypes:desc->types];
inv = [NSInvocation invocationWithMethodSignature:signature];
[inv setSelector:selector];
[inv setArgument:&arg atIndex:2];
[inv invoke];

__autoreleasing id returnObj;    
[inv getReturnValue:&returnObj];    // get created object

「メソッド」は常に「nil」であるため、このアプローチは機能しません。なんで?
上記のコードの呼び出しを介してクラス メソッドを実行する適切な方法は何ですか?

4

2 に答える 2

6

コードが複雑すぎます。NSMethodSignature*ランタイムをいじらずにオブジェクトを取得できます。

signature = [NSString methodSignatureForSelector:@selector(stringWithString:)];
于 2013-01-16T04:49:46.233 に答える
3

stringWithString:はクラス メソッドです。コードは を使用してclass_getInstanceMethod()います。

に変更class_getInstanceMethod()してみてくださいclass_getClassMethod()

于 2013-01-16T04:39:33.097 に答える