Ios va_args()导致EXC_错误访问
我在使用va_args(iOS 7,Xcode 5.1.1,ARC on)时获得了EXC_BAD_访问权限: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
/。。。
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;
}