真正感到困惑的事情:当我用两个不同的变量初始化一个字符串时
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
是一个将数据存放到NSTableView
的NSMutableArray
,数据与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]];