NSLog 打印一个与 NSString 格式不同的字符串

NSLog prints a string different to the NSString with format

这是我真正感到困惑的事情:当我用像这样的两个不同变量的格式初始化一个字符串时

Order *o = [orders objectAtIndex:i];
NSString *line = [[NSString alloc] initWithFormat:(@"%@;%@\n", [o _length], [o _amount])];

然后用

打印出来
NSLog(@"%@", line);

显示如下:

tableviewtest[4812:123250] 200

这是错误的。但是,如果我通过这样做来做同样的事情

NSLog(@"%@;%@\n", [o _length], [o _amount]);

结果是这样的:

tableviewtest[4812:123250] 120cm;200

这就是我希望 line 的样子。为什么会这样?我需要它的格式与 line 相同,以便稍后可以将其写入文本文件。

编辑:

_length_amount 在订单中 @property NSString *_length-class。 orders 是一个 NSMutableArray,它将数据存放到 NSTableView,其中数据与 NSComboBoxes 和 NSTextFields 一起放入。编译器还给出警告:格式字符串不是字符串文字(可能不安全)。

而不是
NSString *line = [[NSString alloc] initWithFormat:(@"%@;%@\n", [o _length], [o _amount])];,
使用
NSString *line = [NSString stringWithFormat:@"%@;%@\n", [o _length], [o _amount]];

@Schemetrical 是正确的,但不是编译器混淆。它是 C 标准中定义的行为。让我们拥有原始源代码:

NSString *line = [[NSString alloc] initWithFormat:(@"%@;%@\n", [o _length], [o _amount])];

arg 列表来自

(@"%@;%@\n", [o _length], [o _amount])

这是按照 C 标准 6.5.17.. 从逗号运算符构建的表达式。这意味着

@"%@;%@\n", [o _length]

被评估为

((void)@"%@;%@\n")
expr = [o _length]

返回表达式。那么

(expr, [o _amount])

被评估为

((void)expr)
expr = [o _amount])

这是用作单个参数的表达式的结果:

NSString *line = [[NSString alloc] initWithFormat:_amount];

因此整个语句是相当不错的C/Objective-C代码。显示警告的唯一原因是格式 arg 不是常量。 (但这绝对不是问题所在。)