Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否有任何方法可以将NSArray传递给需要可变数量参数的方法,例如+;stringWithFormat:_Objective C_Cocoa_Macos - Fatal编程技术网

Objective c 是否有任何方法可以将NSArray传递给需要可变数量参数的方法,例如+;stringWithFormat:

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

一些上下文:我正在尝试清理我的一些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 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注入漏洞。