NSMethodSignature和NSInvocation

例子:

- (void)Invocation {
    
    NSMethodSignature *methodSignature = [[self class] instanceMethodSignatureForSelector:@selector(invocationTest:b:c:)];
    // 创建一个函数签名,这个签名可以是任意的,但需要注意,签名函数的参数数量要和调用的一致。
    
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
    
    int a = 1, b = 2, c = 3, d;
    
    invocation.target = self;
    invocation.selector = @selector(invocationTest:b:c:); // 这地方也可以设置
    // 0,1被target、Selector占用
    [invocation setArgument:&a atIndex:2];
    [invocation setArgument:&b atIndex:3];
    [invocation setArgument:&c atIndex:4];
    
    // [invocation setReturnValue:&d]; // 不是这个,这个给函数返回值赋值
    [invocation getReturnValue:&e];

    [invocation invoke];
    
    printf("d=%d", d);
    
}
- (int)invocationTest:(int)a b:(int)b c:(int)c {
    return a+b+c;
}

从上述的代码中可以看到NSinvocation是对对象发消息的包装。
OC中对对象发消息有三种方法。
1、[objc messageName:paramters]。
2、[objc performSelectXXXX];
3、NSInvocation

第一中方法最简单、直接,用的也最多;
第二种有局限、最多只能带两个参数,并且很容易被替代,懂得不多;
第三种RunTime中用的最多,用于动态添加方法和调用。

你可能感兴趣的:(NSMethodSignature和NSInvocation)