2

下面打印的正确格式应该是什么*newString

NSString *newString = @"Hello this is a string!";
NSLog(@newString);
4

2 回答 2

3

NSLog几乎可以像 C 一样工作printf,并添加了%@用于对象的字符串格式说明符。作为NSString一个对象,%@使用正确的格式:

NSString *newString = @"Hello this is a string!";
NSLog(@"%@", newString);

尽管看起来很诱人,但永远不要

NSLog(newString); //NONONONONO!

因为这是一种糟糕的做法,可能会导致意外崩溃(更不用说安全问题了)。

有关该主题的更多信息:警告:“格式不是字符串文字,也没有格式参数”

于 2013-10-05T19:33:05.947 回答
0

@符号只是指定一些常见的 Objective-C 对象的简写。@"..."表示一个字符串(NSString具体来说,它不同于常规的C字符串),@[...]表示一个数组(NSArray),@{...}表示一个字典(NSDictionary)。

在第一行,您已经使用符号指定了一个NSString对象。现在是一个实例。在第二行,你可以给它的变量名:@newStringNSString

NSLog(newString);

理论上你可以只给出变量名,但这是一种危险的方法。如果newString有任何格式说明符,您的应用程序可能会崩溃/混乱(或访问不应该访问的内容),因为NSLog会尝试读取与格式说明符对应的参数,但参数不存在。安全的解决方案是NSLog(@"%@", newString);. 的第一个参数NSLog现在是硬编码的,不能更改。我们现在知道它将期望一个参数,我们正在提供该参数newString,所以我们是安全的。

因为您已经指定了一个字符串并且只是将该实例传递给NSLog,所以您不再需要该@符号。

于 2013-10-05T19:25:10.823 回答