2013-10-05 25 views

回答

0

@符號只是指定一些常用Objective-C對象的簡寫。 @"..."代表字符串(NSString具體,與常規C字符串不同),@[...]代表數組(NSArray),@{...}代表字典(NSDictionary)。

在第一行上,您已經使用@符號指定了NSString對象。 newString現在是NSString實例。 在第二行,你可以給它的變量名:

​​

可以理論上只需要給變量名,但它是一個危險的方法。如果newString具有任何格式說明符,則您的應用可能會崩潰/弄亂(或訪問它不應該訪問的內容),因爲NSLog會嘗試讀取與格式說明符對應的參數,但參數不存在。安全的解決方案是NSLog(@"%@", newString);NSLog的第一個參數現在是硬編碼的,不能更改。我們現在知道它會期待一個單一的論點,我們正在提供這個論點,newString,所以我們是安全的。

因爲您已經指定了一個字符串,只是將該實例傳遞給NSLog,您不需要再次使用@符號。

+1

這可能是不安全的,你不應該在這個習慣得到。 NSLog(@「%@」,newString);'是正確的。請參閱http://en.wikipedia.org/wiki/Uncontrolled_format_string。 –

+1

-1'NSLog(newString)' –

+0

不會NSLOG處理這個?它無論如何都不接受常規的C字符串,你需要提供一個NSString,它應該被控制。 –

3

NSLog幾乎可以作爲C printf,並增加了%@字符串格式說明符,這是爲對象定義的。作爲NSString對象,%@是正確的格式使用:

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

對於作爲誘人的,因爲它可以看看,NEVER

NSLog(newString); //NONONONONO! 

,因爲它是一個可怕的做法,可能會導致意外崩潰(更不用說安全問題)。關於這個問題

更多信息:Warning: "format not a string literal and no format arguments"