Objective c 是否有任何方法可以将NSArray传递给需要可变数量参数的方法,例如+;stringWithFormat:
一些上下文:我正在尝试清理我的一些FMDB代码。我的one表有很多列,我需要在FMDB中使用的方法是一个需要可变数量参数的方法,类似于NSString的类方法Objective c 是否有任何方法可以将NSArray传递给需要可变数量参数的方法,例如+;stringWithFormat:,objective-c,cocoa,macos,Objective C,Cocoa,Macos,一些上下文:我正在尝试清理我的一些FMDB代码。我的one表有很多列,我需要在FMDB中使用的方法是一个需要可变数量参数的方法,类似于NSString的类方法+stringWithFormat: 例如: [db executeUpdate:@"insert into test (a, b, c, d, e) values (?, ?, ?, ?, ?)" , @"hi'", // look! I put in a ', and I'm not escaping it! [NSString st
+stringWithFormat:
例如:
[db executeUpdate:@"insert into test (a, b, c, d, e) values (?, ?, ?, ?, ?)" ,
@"hi'", // look! I put in a ', and I'm not escaping it!
[NSString stringWithFormat:@"number %d", i],
[NSNumber numberWithInt:i],
[NSDate date],
[NSNumber numberWithFloat:2.2f]];
当一个表只有5列时,情况并没有那么糟,但当一列有20+时,它开始变得毛茸茸的
我想做的是创建一个包含所有db抽象信息的字典,并动态地构建这些查询。我的问题是。。。在Objective-C中,我如何假装该方法需要可变数量的参数,而不是交给它一个NSArray
相关信息:
在FMDatabase上创建一个类别,该类别接受一个数组并进行更新可能更容易。您应该能够复制大部分executeUpdate来执行此操作。这可能不是您要寻找的示例。但在本例中,我会将字符串值放入数组中,然后使用[theArray Components sJoinedByString:@“,“]将它们转换为sql参数列表。我认为NSInvocation可能会执行您希望执行的操作 调用setArgumentForIndex时要小心,因为参数0和1是Obj-C填充的隐式参数,其中参数2是您要传递的第一个“真实”参数。(编辑:这在GCC时代就起作用了。从Xcode 4.6开始,它不在Clang下。)
将数组中的对象放入C数组,然后将其视为varargs列表:
//The example input array
int i = 42;
NSArray *array = [NSArray arrayWithObjects:
[NSString stringWithFormat:@"number %d", i],
[NSNumber numberWithInt:i],
[NSDate date],
[NSNumber numberWithFloat:2.2f],
nil];
//The example destination (using NSString so anyone can test this)
NSString *string = nil;
//The intermediary C array
NSObject **arrayObjects = malloc(sizeof(NSObject *) * [array count]);
if (arrayObjects) {
//Fill out the C array.
[array getObjects:arrayObjects];
//Use the C array as a va_list.
string = [[[NSString alloc] initWithFormat:@"%@ %@ %@ %@" arguments:(va_list)arrayObjects] autorelease];
free(arrayObjects);
}
NSLog(@"string: %@", string);
输出:
2009-03-26 20:10:07.128 NSArray-varargs[606:10b] string: number 42 42 2009-03-26 20:10:07 -0700 2.2
在您的例子中,您将使用
-[FMDatabase executeUpdate:arguments://code>方法。不幸的是,没有。这里有几个月前的相同问题:这就像用锤子敲开螺母一样。有比这更好的解决方案。我不会投票赞成这样做,因为这是一个解决方案,只是不是一个很好的解决方案。从文档中可以看出:“NSInvocation不支持使用可变数量的参数或联合参数调用方法。”我正在尝试对cocos2d iphone framework做同样的事情,并且数组数据被正确复制,但是当我将(va_list)dyn_va_list
传递给期望va list的方法时,它不会设置其va_list参数代码>具有有效地址的变量,并且我获得EXC\u BAD\u访问权限。我疯了,请帮帮我。谢谢。我发现在这种情况下,如果不将类方法的va_start更改为va_copy,动态va_列表就不起作用。不确定它对其他任何类都会起什么作用,但事情就是这样。(进一步阅读:)Brenden:如果它不是需要格式化为字符串的对象的有效C数组,那么这将不起作用。你应该问一个完整的问题,并摘录你的代码,包括数组中项目的示例和格式字符串。这是正确的解决方案。我在这里找到了一个很好的解释:Smartish。但最终不得不打破,因为它依赖于未记录的行为。Xcode 4.6现在不会编译它:错误:在需要算术或指针类型的地方使用了类型“va_list”(又名“va_builtin_va_list”)
这将导致SQL注入漏洞。