【问题标题】:iPhone - Creating variadic functions in objective c issueiPhone - 在目标 c 问题中创建可变参数函数
【发布时间】:2012-09-28 14:11:38
【问题描述】:

我参考了this SO Answer 在目标 C 中创建可变参数函数。 我通过传递如下参数来测试您的代码:

[self logMessage:@"string: %@\n number: %@\n image: %@",
 @"asdf",
 [NSNumber numberWithInt:23],
 [UIImage imageNamed:@"local.png"]];

并用 NSLog() 编辑了代码;

- (void)logMessage:(NSString *)format, ... {

    va_list args;
    va_start(args, format);

    id arg = nil;
    int i = 1;
    NSLogv(format, args);
    while ((arg = va_arg(args,NSString *))) {

        NSLog(@"val: %d", i++);
        /// Do your thing with arg here
        //NSString *name = NSStringFromClass([arg class]);
        //NSLog(@"string: %@", name);
    }        
    va_end(args);
}

但是输出如下:

2012-09-28 19:34:45.271 SIMO[2384:c07] string: asdf
 number: 23
 image: <UIImage: 0x8151f80>
2012-09-28 19:34:45.273 SIMO[2384:c07] val: 1
2012-09-28 19:34:45.273 SIMO[2384:c07] val: 2
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 3
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 4
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 5
2012-09-28 19:34:45.275 SIMO[2384:c07] val: 6
2012-09-28 19:34:45.275 SIMO[2384:c07] val: 7
2012-09-28 19:34:45.276 SIMO[2384:c07] val: 8

这说明参数是 8,但我只传递了 3 (NSString, NSNumber, UIImage) 我无法理解这个概念..你能澄清一下吗 有人能澄清一下吗

【问题讨论】:

    标签: iphone objective-c function methods


    【解决方案1】:

    va_arg 并不知道参数列表何时结束。您使用的方法期望参数列表由nil 终止,例如+[NSArray arrayWithObjects:]

    因此,要么更改您的调用以在参数列表的末尾添加nil,要么找到其他方法来了解参数何时结束(例如,对于 printf 克隆,您可能会从格式化字符串本身)。

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多