如何用变量做NSLog

时间:2013-10-05 19:17:35

标签: objective-c

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

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

2 个答案:

答案 0 :(得分:3)

NSLog几乎与C printf一样,添加了%@字符串格式说明符,用于对象。作为NSString对象,%@是正确的格式:

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

为了看起来很诱人,从不

NSLog(newString); //NONONONONO!

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

有关此主题的更多信息:Warning: "format not a string literal and no format arguments"

答案 1 :(得分:0)

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

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

<击> NSLog(newString);

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

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