NSInvocation。你好。

在iOS中调用方法的时候超过2两个参数的时候通常使用NSInvocation。

NSInvocation可以处理参数、返回值。

会java的人都知道反射操作,其实NSInvocation就相当于反射操作。

在官方文档中有明确说明,NSInvocation对象只能使用其类方法来初始化,不可使用alloc/init方法。

它执行调用之前,需要设置两个方法:setSelector: 和setArgument:atIndex:

使用示例:

1、

    SEL method = @selector(testInvocation);

    NSMethodSignature *signature = [[self class] methodSignatureForSelector:@selector(init)];

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    [invocation setTarget:self];

    [invocation setSelector:method];

    

    [invocation invoke];

- (void)testInvocation

{

    NSLog(@"test");

}

2、

    SEL method = @selector(testInvocation:);

    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:method];

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    [invocation setTarget:self];

    [invocation setSelector:method];

    int a = 30;

    [invocation setArgument:&a atIndex:2];

    [invocation retainArguments];

    [invocation invoke];

- (void)testInvocation:(int)a

{

    NSLog(@"test a");

}

3、

    SEL method = @selector(testInvocation:param:);

    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:method];

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    [invocation setTarget:self];

    [invocation setSelector:method];

    int a = 30;

    int bb = 20;

    

    [invocation setArgument:&a atIndex:2];

    [invocation setArgument:&bb atIndex:3];

    [invocation retainArguments];

    

    [invocation invoke];

    

    int d;

    

    [invocation getReturnValue:&d];

    

    NSLog(@“%d",d);

- (int)testInvocation:(int)a param:(int)b

{

    NSLog(@"test a + b");

    

    return a + b;

}

 

End。:)

尊重原创内容,转载请注明出处
本文链接地址: https://www.awnlab.com/archives/227

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注