Variadic函数没有nil终止

时间:2011-05-14 15:54:39

标签: cocoa-touch xcode ios preprocessor

我正在尝试创建如下方法:

- (void)setCondition:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

但是因为我对预处理器不太好,所以我在下面的代码片段中遇到了一个问题,但是我想知道是否有更清洁的方法来实现我想要的,这是在提供了参数

+ (CRCondition *)conditionWithFormat:(NSString *)format,... {
CRCondition *condition      = [[CRCondition alloc] init];

NSArray *conditionSliced    = [condition sliceFormatOperationFromString:format];

condition->_leftOperand     = [[conditionSliced objectAtIndex:0] retain];
condition->_operator        = [condition operatorFromString:[conditionSliced objectAtIndex:1]];
condition->_rightOperand    = [[conditionSliced objectAtIndex:2] retain];

id eachObject;
va_list argumentList;

va_start(argumentList, format);
while ((eachObject = va_arg(argumentList, id))) {
    if ([condition->_leftOperand isEqualToString:@"%K"]) {

        [condition->_leftOperand release];

        if ([eachObject isKindOfClass:[NSString class]])
            condition->_leftOperand = [eachObject retain];

        else
            condition->_leftOperand = [[eachObject description] retain];
    }

    else if ([condition->_rightOperand isKindOfClass:[NSString class]] &&
             [condition->_rightOperand isEqualToString:@"%@"]) {

        [condition->_rightOperand release];
        condition->_rightOperand = [eachObject retain];
    }

    else
        break;
}
va_end(argumentList);

if (![condition isOperatorValid]) {
    NSException *exception = [NSException exceptionWithName:@"Invalid Condition Operator" 
                                                     reason:@"The operator passed is invalid. Must follow the following regex pattern: ([(=><)|(A-Z)]{1,2})" 
                                                   userInfo:nil];
    [exception raise];
}

return [condition autorelease];

}

问题在于while循环圈出并超越提供的参数(我知道为什么它为我提供了其他值,cmd args等)

如果您需要更多解释,请添加评论,以便我可以回复您。

1 个答案:

答案 0 :(得分:1)

通常的方法是先解析格式字符串,然后根据它确定应该跟随多少个参数(对于任何格式字符串,通常只有一个有效数量的参数)。如果参数的数量不能从格式字符串中推导出来,则通常使用nil终止列表(如arrayWithObjects:...中所示)。