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


这是我

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

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在订单类中。 orders是一个将数据存放到NSTableViewNSMutableArray,数据与NSComboBox和NSTextFields一起放入。编译器还会发出警告:格式字符串不是字符串文字(可能不安全)。

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

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

参数列表是从

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

这是由遵循 C 标准 6.5.17 的逗号运算符构建的表达式。这意味着

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

被评估为

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

返回 expr。然后

(expr, [o _amount])

被评估为

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

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

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

因此,整个语句是非常好的C/Objective-C代码。显示警告的唯一原因是格式 arg 不是常量。(但这绝对不是出了问题。

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

最新更新