Ios va_args()导致EXC_错误访问

Ios va_args()导致EXC_错误访问,ios,objective-c,sqlite,fmdb,variadic-functions,Ios,Objective C,Sqlite,Fmdb,Variadic Functions,我在使用va_args(iOS 7,Xcode 5.1.1,ARC on)时获得了EXC_BAD_访问权限: /。。。 int val=sqlIntQuery(@“格式字符串”,“arg1”);// 您需要使用nil或其他方法来知道要获取多少参数va_list没有知道何时停止的神奇方法 像stringWithFormat:这样的东西不需要nil,因为它根据格式说明符的数量来确定参数的数量(这就是为什么它们需要匹配,否则代码就会爆炸)。注意NSDictionary Dictionary Dicti

我在使用va_args(iOS 7,Xcode 5.1.1,ARC on)时获得了EXC_BAD_访问权限:

/。。。

int val=sqlIntQuery(@“格式字符串”,“arg1”);// 您需要使用
nil
或其他方法来知道要获取多少参数
va_list
没有知道何时停止的神奇方法

stringWithFormat:
这样的东西不需要
nil
,因为它根据格式说明符的数量来确定参数的数量(这就是为什么它们需要匹配,否则代码就会爆炸)。注意
NSDictionary Dictionary Dictionary With Objects and Keys:
等方法如何需要
nil
终止符或
UIAlertView initWithTitle…
需要
nil
终止符作为
otherButtonTitles
参数

您可以使用以下
NSString
方法:

- (int)sqlIntQuery:(NSString *)format, ... {
    va_list args;
    va_start(args, format);
    NSString *msg = [[NSString alloc] initWithFormat:format arguments:args];
    // do whatever
    va_end(args);

    return 5;
}
当然,这个解决方案假设您希望从
格式
和方法的变量参数构建一个字符串


如果确实需要填充数组,那么在调用
sqlIntQuery
方法时,需要传递一个
nil
终止符。

为什么不应该使用“nil”作为终止符/哨兵?我认为va_arg不支持这种循环。请记住,您的解决方案虽然很好,但很脆弱。如果传递了额外的参数,它们将被默默忽略。如果传递的参数太少,则应用程序可能会崩溃或更糟,它可能会运行,但数据不正确。小心。
- (int)sqlIntQuery:(NSString *)format, ...
{
    int numberOfArgs = [format componentsSeparatedByString:@"?"].count - 1; // <<-- this solved my problem

    va_list args;
    va_start(args,format);
    NSMutableArray *arguments = [NSMutableArray array];
    while ( numberOfArgs-- ) {
        id eachObject = va_arg(args, id);
        [arguments addObject:eachObject];
    }
    va_end(args);

    FMResultSet *rs = [db executeQuery:format withArgumentsInArray:arguments];
    [rs next];
    int ret = [rs intForColumnIndex:0];
    [rs close];

    return ret;
}
- (int)sqlIntQuery:(NSString *)format, ... {
    va_list args;
    va_start(args, format);
    NSString *msg = [[NSString alloc] initWithFormat:format arguments:args];
    // do whatever
    va_end(args);

    return 5;
}