3 回答
TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
您是否正確嵌套了括號(hào)?我不NSLog()喜歡只接受一個(gè)論點(diǎn),這就是您要通過的論點(diǎn)。另外,它已經(jīng)為您完成了格式化。為什么不這樣做呢?
NSLog(@"%@ %@, %@",
errorMsgFormat,
error,
[error userInfo]);
或者,由于您說的errorMsgFormat是帶有單個(gè)占位符的格式字符串,您是否要這樣做?
NSLog(@"%@, %@", [NSString stringWithFormat:errorMsgFormat, error],
[error userInfo]);
TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
Xcode抱怨,因?yàn)檫@是一個(gè)安全問題。
這是與您相似的代碼:
NSString *nameFormat = @"%@ %@";
NSString *firstName = @"Jon";
NSString *lastName = @"Hess %@";
NSString *name = [NSString stringWithFormat:nameFormat, firstName, lastName];
NSLog(name);
最后的NSLog語句將執(zhí)行以下操作:
NSLog(@"Jon Hess %@");
這將導(dǎo)致NSLog尋找另外一個(gè)字符串參數(shù),但是沒有一個(gè)。由于C語言的工作方式,它將從堆棧中獲取一些隨機(jī)垃圾指針,并嘗試將其視為NSString。這很可能會(huì)使您的程序崩潰?,F(xiàn)在您的字符串中可能沒有%@,但是有一天它們可能會(huì)。您應(yīng)該始終將帶有明確控制的數(shù)據(jù)的格式字符串用作采用格式字符串的函數(shù)的第一個(gè)參數(shù)(printf,scanf,NSLog,-[NSString stringWithFormat:],...)。
正如Otto指出的那樣,您可能應(yīng)該做以下事情:
NSLog(errorMsgFormat, error, [error userInfo]);
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
最終答案:正如喬恩·赫斯(Jon Hess)所說,這是一個(gè)安全問題,因?yàn)槟獙HATEVER字符串傳遞給需要格式字符串的函數(shù)。也就是說,它將評(píng)估任何字符串內(nèi)的所有格式說明符。如果沒有,那太棒了,但是如果有,那么可能會(huì)發(fā)生壞事。
那么,正確的做法是直接使用格式字符串,例如
NSLog(@"%@", myNSString);
這樣,即使myNSString中有格式說明符,它們也不會(huì)被NSLog評(píng)估。
- 3 回答
- 0 關(guān)注
- 718 瀏覽
添加回答
舉報(bào)
