令人惊讶的是,这有效:
CGAffineTransform (^block)(id x, int y, CGSize z) = ^(id x, int y, CGSize z){
NSLog(@"%@,%d,%@", x, y, NSStringFromCGSize(z));
CGAffineTransform t = { 1, 2, 3, 4, 5, 6 };
return t;
};
NSMethodSignature* sign = [NSMethodSignature signatureWithObjCTypes:block_signature(block3)];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:sign];
[invocation setTarget:block3];
void* x = (__bridge void*)@"Foo";
int y = 42;
CGSize z = { 320, 480 };
[invocation setArgument:&x atIndex:1];
[invocation setArgument:&y atIndex:2];
[invocation setArgument:&z atIndex:3];
[invocation invoke];
CGAffineTransform t;
[invocation getReturnValue:&t];
但另一方面,这并不:
NSMethodSignature* sign = [self methodSignatureForSelector:@selector(class)];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:sign];
[invocation setTarget:block];
[invocation setSelector:@selector(class)];
[invocation invoke];
Class k = nil;
[invocation getReturnValue:&k];
AFAICS从拆解、实施[NSInvocation invoke]
检查目标的类,如果它是一个块(NSBlock
)然后它总是调用块函数,无论签名如何。
Updated:报告为雷达://25289979