3 回答

TA貢獻1852條經驗 獲得超1個贊
您是否正確嵌套了括號?我不NSLog()喜歡只接受一個論點,這就是您要通過的論點。另外,它已經為您完成了格式化。為什么不這樣做呢?
NSLog(@"%@ %@, %@",
errorMsgFormat,
error,
[error userInfo]);
或者,由于您說的errorMsgFormat是帶有單個占位符的格式字符串,您是否要這樣做?
NSLog(@"%@, %@", [NSString stringWithFormat:errorMsgFormat, error],
[error userInfo]);

TA貢獻2037條經驗 獲得超6個贊
Xcode抱怨,因為這是一個安全問題。
這是與您相似的代碼:
NSString *nameFormat = @"%@ %@";
NSString *firstName = @"Jon";
NSString *lastName = @"Hess %@";
NSString *name = [NSString stringWithFormat:nameFormat, firstName, lastName];
NSLog(name);
最后的NSLog語句將執行以下操作:
NSLog(@"Jon Hess %@");
這將導致NSLog尋找另外一個字符串參數,但是沒有一個。由于C語言的工作方式,它將從堆棧中獲取一些隨機垃圾指針,并嘗試將其視為NSString。這很可能會使您的程序崩潰?,F在您的字符串中可能沒有%@,但是有一天它們可能會。您應該始終將帶有明確控制的數據的格式字符串用作采用格式字符串的函數的第一個參數(printf,scanf,NSLog,-[NSString stringWithFormat:],...)。
正如Otto指出的那樣,您可能應該做以下事情:
NSLog(errorMsgFormat, error, [error userInfo]);

TA貢獻1827條經驗 獲得超8個贊
最終答案:正如喬恩·赫斯(Jon Hess)所說,這是一個安全問題,因為您要將WHATEVER字符串傳遞給需要格式字符串的函數。也就是說,它將評估任何字符串內的所有格式說明符。如果沒有,那太棒了,但是如果有,那么可能會發生壞事。
那么,正確的做法是直接使用格式字符串,例如
NSLog(@"%@", myNSString);
這樣,即使myNSString中有格式說明符,它們也不會被NSLog評估。
- 3 回答
- 0 關注
- 701 瀏覽
添加回答
舉報