有一个功能:
-(void) BlockCall:(void (^)(float a, float b, NSObject *object, NSObject *secObject, NSObject *thirdObject)) argBlock
withObject: (NSObject *)object
andSObj:(NSObject *)sobject
andTObj:(NSObject *)tobject
{
object = [[NSObject alloc] init];
sobject = [[NSObject alloc] init];
tobject = [[NSObject alloc] init];
NSLog(@"First object:%@", object);
NSLog(@"Second object:%@", sobject);
NSLog(@"Third object:%@", tobject);
argBlock(15 ,27, object, sobject, tobject);
}
和varardic阻止:
jvalue (^voidBlock)(va_list args, ...);
voidBlock= ^(va_list args, ...){
va_arg(parsArgs, double);
va_arg(parsArgs, double);
id NSObjectArg = va_arg(parsArgs, id);
id NSObjectArg2 = va_arg(parsArgs, id);
id NSObjectArg3 = va_arg(parsArgs, id);
va_end(parsArgs);
}
如果我用正确的参数调用此函数并将此块作为参数传递。我会得到奇怪的结果。它将读取第一个和第二个浮点数,然后它将读取第二个传递的对象作为第一个,第三个传递的对象作为第二个。无论之前有多少个原语,或者如果没有原语,读取va_list将始终松散第一个指针类型。 如果我将这个块定义更改为接受固定的args,一切都会好的,但是我确实松开了第一个指针arg
答案 0 :(得分:0)
这段代码没有任何意义。为什么你会有一个函数(块),它既需要va_list
(这是另一个函数的编码)和varargs?这没有意义。此外,parsArgs
在哪里定义?为什么没有va_start
?谁在叫这个街区?谁传递了这个va_list
以及随后的论点?