原創Blog。轉載請注明出處
blog.csdn.net/hello_hwc
歡迎關注我的iOS SDK具體解釋專欄,這里有非常多基礎的文章。
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
前言:warnings是編碼中非常重要的一個環節,編譯器給出合理的warning能幫助開發人員找到自己代碼的問題,防止非常多bug產生。
默認用XCode創建一個project,會自己主動開啟一些重要的warnings。可是很多其它的時候,我們須要編譯器更完整的提醒。
iOS開發採用Clang編譯器。
默認的Warning能夠在Build Settings里找到
在search里搜索Warnings,就能夠看到如圖,這是為全部語言開啟的warnings

當然。也能夠為不同語言開啟warning,也在Build Settings里

可是。這樣一個個的開啟關閉定制化非常好。有時候我們僅僅須要開啟全部或者開啟全部重要的warnings就可以
這時候,進入
能夠加入一些build flag來啟用警告。基本的就是三個
1.-Wall Clang覺得自己能夠准確報出的警告
2. -Wextra額外的苛刻的警告。這些警告不一定會造成錯誤。比如假設使用這個flag,把singned 賦值給unsigned就會觸發警告,而大多數時候這樣賦值是沒問題的。
3.-Weverything 全部警告
一般的項目都是開啟-Wall和-Wextra兩個警告來保證沒有嚴重錯誤。當然。假設有些明顯的不會出錯。能夠用關閉某個或者某些警告。
-Wall -Wno-unused-variable //啟用Wall可是剔除unused-variable
用語句強制開啟或者關閉某個警告
強制開啟一個警告
#warning "This method can not be used"
強制開啟一個錯誤
#error "You must add this key,or you will fail"

強制關閉一個警告
比如
這里會出現警告test這個selector沒有實現
[self performSelector:@selector(test) withObject:nil];
強制關閉這個警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
[self performSelector:@selector(test) withObject:nil];
#pragma clang diagnostic pop
經常使用的CLang Warning
- Wall
- Wbad-function-cast
- Wcast-align
- Wconversion
- Wdeclaration-after-statement
- Wdeprecated-implementations
- Wextra
- Wfloat-equal
- Wformat=2
- Wformat-nonliteral
- Wfour-char-constants
- Wimplicit-atomic-properties
- Wmissing-braces
- Wmissing-declarations
- Wmissing-field-initializers
- Wmissing-format-attribute
- Wmissing-noreturn
- Wmissing-prototypes
- Wnested-externs
- Wnewline-eof
- Wold-style-definition
- Woverlength-strings
- Wparentheses
- Wpointer-arith
- Wredundant-decls
- Wreturn-type
- Wsequence-point
- Wshadow
- Wshorten-64-to-32
- Wsign-compare
- Wsign-conversion
- Wstrict-prototypes
- Wstrict-selector-match
- Wswitch
- Wswitch-default
- Wswitch-enum
- Wundeclared-selector
- Wuninitialized
- Wunknown-pragmas
- Wunreachable-code
- Wunused-function
- Wunused-label
- Wunused-parameter
- Wunused-value
- Wunused-variable
- Wwrite-strings
困難模式
所謂的困難模式就是開啟全部警告。而且把警告當作error。這意味着,僅僅要另一個警告存在,那么程序將不能編譯執行。

參考鏈接
http://onevcat.com/2013/05/talk-about-warning/
http://programmers.stackexchange.com/questions/122608/clang-warning-flags-for-objective-c-development
http://amattn.com/p/better_apps_clang_weverything_or_wall_is_a_lie.html
http://nshipster.cn/clang-diagnostics/
