前言:
最近做項目時遇到了很多莫名其妙的問題,其中就有這個打印(NSLog)。也不多廢話了,我們先來回顧一下Xcode8發布以來,我們遇到的一些關於打印的問題,當然也有解決方法:
1、Xcode8打印問題
先看下面這個圖片,相信使用Xcode升級到Xcode8的都不陌生吧。
當時的感覺就是莫名其妙,這里打印出來的一大堆日志,然而對於我們開發並沒有多大用處,個人感覺是apple測試Xcode時查看的打印信息,發布時忘記刪掉的原因(謹代表個人想法,若有錯誤,望指出)。當然,網上也給出了解決方法:
很簡單
在EditScheme -> Run -> Arguments
在Environment Variables一欄中添加OS_ACTIVITY_MODE
並設值為Disable
,注意打勾。然后clean一下。運行項目即可解決。
2、Xcode8+iOS10 真機測試。
上面說了,我們為了屏蔽掉那堆沒多大用處的log。添加了OS_ACTIVITY_MODE
並設值為Disable。這也是前提,現在問題出現了:我使用iOS10真機測試時發現宏定義的
NSLog打印在控制台不顯示現象。當時首先想到的也是:添加了OS_ACTIVITY_MODE
並設值為Disable
的問題。如果不想看到那堆沒多大用處的log,又想顯示打印信息,怎么辦?網上有一些給出的方法,也能很好的解決問題,但前提是你使用的宏定義大體是這樣的:
#ifdef DEBUG #define NSLog(...) NSLog(@"\n%s方法,\n第%d行,打印內容:\n%@\n打印結束\n", __PRETTY_FUNCTION__, __LINE__, [NSString stringWithFormat:__VA_ARGS__])
#else
#define NSLog(...)
#endif
那么你可以這樣解決問題,方法如下:
#ifdef DEBUG #define NSLog(format, ...) printf("[%s] %s [第%d行] %s\n", __TIME__, __FUNCTION__, __LINE__, [[NSString stringWithFormat:format, ## __VA_ARGS__] UTF8String]);
#else
#define NSLog(format, ...)
#endif
解釋:這是因為在完成OS_ACTIVITY_MODE
設置后會發現真機調試時NSLog不輸出了。所以需要定義成另一個函數來輸出,例如printf()。
可以看下這篇文章:Xcode8模擬器警告與iOS10真機調試NSLog無效
3、Xcode8.1 +iOS10以上系統,真機測試和模擬器測試,打印均不顯示問題
<1>真機測試
如果只是真機測試打印顯示無效的話,可以直接按照上面第二個方法去解決,也是能解決問題的,究其原因:還是添加了OS_ACTIVITY_MODE
並設值為Disable
的問題。
<2>模擬器測試
如果在改過真機測試打印顯示無效的問題后,模擬器測試打印還是無效的話,現在的解決方法就直接了:刪除OS_ACTIVITY_MODE
並設值為Disable這個設置
。
為此也做過很多嘗試,感覺最直接的方法還是直接去掉OS_ACTIVITY_MODE
並設值為Disable這個設置,是最好的解決方法。Xcode8.1也解決了“打印一堆沒多大用處的log”的問題,所以去掉一開始添加
OS_ACTIVITY_MODE
並設值為Disable 的想法吧。不過這還是只針對Xcode8以上(當然不包括Xcode8)。
這篇文章也很不錯:iOS開發-NSLog不打印設置