Var args块参数解析丢失1指针arg

时间:2015-02-19 08:19:28

标签: objective-c block variadic-functions

有一个功能:

-(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

1 个答案:

答案 0 :(得分:0)

这段代码没有任何意义。为什么你会有一个函数(块),它既需要va_list(这是另一个函数的编码)和varargs?这没有意义。此外,parsArgs在哪里定义?为什么没有va_start?谁在叫这个街区?谁传递了这个va_list以及随后的论点?