下面打印*newString
的正确格式应该是什么?
NSString *newString = @"Hello this is a string!";
NSLog(@newString);
答案 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
,所以您不需要再次使用@
符号。