亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

警告:“不格式化字符串文字,不格式化參數”

警告:“不格式化字符串文字,不格式化參數”

慕田峪9158850 2019-11-26 15:32:06
自升級到最新的Xcode 3.2.1和Snow Leopard以來,我一直收到警告“不格式化字符串文字,不格式化參數”從以下代碼中:NSError *error = nil;if (![self.managedObjectContext save:&error]) {    NSLog([NSString stringWithFormat:@"%@ %@, %@",        errorMsgFormat,        error,        [error userInfo]]);      }如果errorMsgFormat是NSString帶有格式說明符(例如"print me like this: %@":),那么上述NSLog調用有什么問題?推薦的解決方法是什么,以便不生成警告?
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

您是否正確嵌套了括號?我不NSLog()喜歡只接受一個論點,這就是您要通過的論點。另外,它已經為您完成了格式化。為什么不這樣做呢?


NSLog(@"%@ %@, %@", 

   errorMsgFormat, 

   error, 

   [error userInfo]);              

或者,由于您說的errorMsgFormat是帶有單個占位符的格式字符串,您是否要這樣做?


NSLog(@"%@, %@", [NSString stringWithFormat:errorMsgFormat, error], 

   [error userInfo]);              


查看完整回答
反對 回復 2019-11-26
?
阿晨1998

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]);


查看完整回答
反對 回復 2019-11-26
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

最終答案:正如喬恩·赫斯(Jon Hess)所說,這是一個安全問題,因為您要將WHATEVER字符串傳遞給需要格式字符串的函數。也就是說,它將評估任何字符串內的所有格式說明符。如果沒有,那太棒了,但是如果有,那么可能會發生壞事。


那么,正確的做法是直接使用格式字符串,例如


NSLog(@"%@", myNSString);

這樣,即使myNSString中有格式說明符,它們也不會被NSLog評估。

查看完整回答
反對 回復 2019-11-26
  • 3 回答
  • 0 關注
  • 701 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號