2012-06-05 14 views
5

NSMethodSignature+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelectorNSObjectとなります。次に、NSInvocation+ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)signatureNSInvocationを使用してクラスメソッドを呼び出すにはどうすればよいですか?

で作成してください。 のメソッドシグネチャしか取得できません。クラスメソッドはどうですか?

NSMethodSignature *pMS = [[YourObject class] methodSignatureForSelector: (SEL)aSelector]; 

あなたは、クラスのメソッドを取得するために使用できるクラスオブジェクト(シングルトン)のインスタンスを返す[YourObject class]フラグメント:

答えて

7

次の方法でクラスメソッドを取得することができます。

追加:新しいコメントは下記の通りです。あなたは、次の操作を行うことができます

NSMethodSignature *pMS = [YourObject methodSignatureForSelector: (SEL)aSelector]; 
+1

あなたも 'class'一部を必要としないを示すNSInvocation経由クラス(およびインスタンスメソッド)を呼び出すに関する追加の詳細があります。 'YourObject'に送ることもできます。クラス名もtypedefであるだけでなく、ファーストクラスのオブジェクトでもあります。 –

+0

お役立ち情報thx;) – Kent

+0

ありがとう!しかしこれは '-'で始まるインスタンスメソッドとして宣言されたメソッドでのみ動作します。私はmethodメソッドを宣言してもクラスメソッドとして宣言できません。これは '+'で始まります。 –

1

ここmethodForSignature:instanceMethodForSignature:

@interface SomeObject : NSObject 
+ (void)instanceAndClass; 
- (void)instanceAndClass; 
+ (void)classOnly; 
- (void)instanceOnly; 
@end 

@implementation SomeObject 
+ (void)instanceAndClass { NSLog(@"Class version"); } 
- (void)instanceAndClass { NSLog(@"Instance version"); }  
+ (void)classOnly { NSLog(@"Class only"); } 
- (void)instanceOnly { NSLog(@"Instance only"); } 
@end 

@implementation Foo 

- (void)invoke:(id)receiver signature:(NSMethodSignature *)signature selector:(SEL)selector { 
    if (!signature) { 
     NSLog(@"method signature is nil"); 
     return; 
    }   
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
    invocation.selector = selector; 
    invocation.target = receiver; 
    [invocation invoke]; 
} 

- (void)foo { 
    NSMethodSignature *signature; 
    SomeObject *someObject = [SomeObject new]; 

    signature = [someObject methodSignatureForSelector:@selector(instanceAndClass)]; 
    [self invoke:someObject signature:signature selector:@selector(instanceAndClass)]; 
    // 2015-07-10 11:01:10.227 FooBar[65312:3097866] Instance version 
    [self invoke:[someObject class] signature:signature selector:@selector(instanceAndClass)]; 
    // 2015-07-10 11:01:10.227 FooBar[65312:3097866] Class version 

    signature = [someObject methodSignatureForSelector:@selector(classOnly)]; 
    [self invoke:someObject signature:signature selector:@selector(classOnly)]; 
    // 2015-07-10 11:01:10.227 FooBar[65312:3097866] method signature is nil 

    signature = [[someObject class] methodSignatureForSelector:@selector(classOnly)]; 
    [self invoke:[someObject class] signature:signature selector:@selector(classOnly)]; 
    // 2015-07-10 11:01:10.228 FooBar[65312:3097866] Class only 

    signature = [someObject methodSignatureForSelector:@selector(instanceOnly)]; 
    [self invoke:someObject signature:signature selector:@selector(instanceOnly)]; 
    // 2015-07-10 11:01:10.228 FooBar[65312:3097866] Instance only 

    signature = [[someObject class] methodSignatureForSelector:@selector(instanceOnly)]; 
    [self invoke:[someObject class] signature:signature selector:@selector(instanceOnly)]; 
    2015-07-10 11:01:10.228 FooBar[65312:3097866] method signature is nil 

    signature = [[someObject class] instanceMethodSignatureForSelector:@selector(instanceOnly)]; 
    [self invoke:someObject signature:signature selector:@selector(instanceOnly)]; 
    // 2015-07-10 11:01:10.228 FooBar[65312:3097866] Instance only 
} 
+0

ヘルプの読み込み。ありがとう。 –

関連する問題