亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

談談Objective-C的警告(轉)

2019-11-14 20:11:59
字體:
來源:轉載
供稿:網友

原文地址:http://onevcat.com/2013/05/talk-about-warning/

 

一個有節操的程序員會在乎自己的代碼的警告,就像在乎飯碗邊上有只死蟑螂那樣。 ——@onevcat

重視編譯警告

現在編譯器有時候會很吵,而編譯器給出的警告對開發者來說是很有用的信息。警告不會阻止繼續編譯和鏈接,也不會導致程序不能運行,但是很多時候編譯器會先你一步發現問題所在,對于Objective-C來說特別如此。Clang不僅對于明顯的錯誤能夠提出警告(比如某方法或者接口未實現),也能對很多潛在可能的問題做出提示(比如方法已經廢棄或者有問題的轉換),而這些問題在很多時候都可能成為潛在的致命錯誤,必須加以重視。

像Ruby或者php這樣的動態語言沒有所謂的編譯警告,而C#或者java這類語言的警告很多都是不得不照顧的廢棄方法什么的,很多開發者已經習慣于忽略警告進行開發。OC由于現在由蘋果負責維護,Clang的LLVM也同時是蘋果在做,可以說從語言到編譯器到SDK全局都在掌握之中,因此做OC開發時的警告往往比其他語言的警告更有參考價值。打開盡可能多的警告提示,并且在程序開發中盡量避免生成警告,對于構建一個健壯高效的程序來說,是必須的。

在Xcode中開啟額外警告提示

Xcode的工程模板已經為我們設置開啟了一些默認和常用的警告提示,這些默認設置為了兼容一些上年頭的項目,并沒有打開很多,僅是指對最危險和最常見的部分進行了警告。這對于一個新項目來說這是不夠用的(至少對我來說是不夠用的),在無數前輩大牛的教導下,首先要做的事情就是打開盡可能多的警告提示。

最簡單的方法是通過UI來打開警告。在Xcode中,Build Setting選項里為我們預留了一些打開警告的開關,找到并直接勾選相應的選項就可以打開警告。大部分時間里選項本身已經足夠能描述警告的作用和產生警告的時機,如果不是很明白的話,在右側的Quick Help面板里有更詳細的說明。對于OC開發來說特有的警告都在Apple LLVM compiler 4.2 - Warnings - Objective C一欄中,不管您是不是決定打開它們,都是值得花時間看一看加以了解的,因為它們都是寫OC程序時最應該避免的情況。另外幾個Apple LLVM compiler 4.2 - Warnings - …(All languages和C++)也包含了大量的選項,以方便控制警告產生。

Xcode設置中的警告選項

當然在UI里一個一個點擊激活警告雖然簡單,但每次都這樣來一回是一種一點也不有趣的做法,特別是在你已經了解它們的內容并決定打開它們的時候。在編譯選項中加入合適的flag能夠打開或者關閉警告:在Build Setting中的Other C Flags里添加形似-W...的編譯標識。你可以在其中填寫任意多的-W...以開關某些警告,比如,填寫為-Wall -Wno-unused-variable即可打開“全部”警告(其實并不是全部,只是一大部分嚴重警告而已),但是不啟用“未使用變量”的警告。使用-W...的形式,而不是在UI上勾選的一大好處是,在編譯器版本更新時,新加入的警告如果包含在-Wall中的話,不需要對工程做任何修改,新的警告即可以生效。這樣立即可以察覺到同一個工程由于編譯器版本更新時可能帶來的隱患。另外一個更重要的原因是..Xcode的UI并沒有提供所有的警告 =_=||..

剛才提到的,需要注意的是,-Wall的名字雖然是all,但是這真的只是一個迷惑人的詞語,實際上-Wall涵蓋的僅只是所有警告中的一個子集。在StackExchange上有一個在Google工作的Clang開發者進行的回答,其中解釋了有一些重要的警告組:

  • -Wall 并不是所有警告。這一個警告組開啟的是編譯器開發者對于“你所寫的代碼中有問題”這一命題有著很高的自信的那些警告。要是在這一組設定下你的代碼出現了警告,那基本上就是你的代碼真的存在嚴重問題了。但是同時,并不是說打開Wall就萬事大吉了,因為Wall所針對的僅僅只是經典代碼庫中的為數不多的問題,因此有一些致命的警告并不能被其捕捉到。但是不論如何,因為Wall的警告提供的都是可信度和優先級很高的警告,所以為所有項目(至少是所有新項目)打開這組警告,應該成為一種良好的習慣。
  • -Wextra 如其所名,-Wextra組提供“額外的”警告。這個組和-Wall組幾乎一樣有用,但是有些情況下對于代碼相對過于嚴苛。一個很常見的例子是,-Wextra中包含了-Wsign-compare,這個警告標識會開啟比較時候對signed和unsigned的類型檢查,當比較符兩邊一邊是signed一邊是unsigned時,產生警告。其實很多代碼并沒有特別在意這樣的比較,而且絕大多數時候,比較signed和unsigned也是沒有太大問題的(當然不排除會有致命錯誤出現的情況)。需要注意,-Wextra-Wall是相互獨立的兩個警告組,雖然里面打開的警告標識有個別是重復的,但是兩組并沒有包含的關系。想要同時使用的話必須在Other C Flags中都加上
  • -Weverything 這個是真正的所有警告。但是一般開發者不會選擇使用這個標識,因為它包含了那些還正在開發中的可能尚存bug的警告提示。這個標識一般是編譯器開發者用來調試時使用的,如果你想在自己的項目里開啟的話,警告一定會爆棚導致你想開始撞墻..

-Wall和-Wextra下0警告的工程,在-Weverything下的表現,可以用慘不忍睹來形容

關于某個組開啟了哪些警告的說明,在GCC的手冊中有一個參考。雖然蘋果現在用的都是LLVM了,但是這部分內容應該是繼承了GCC的設定。

控制警告,局部加入或關閉

Clang提供了我們自己加入警告或者暫時關閉警告的辦法。

強制加入一個警告:

//Generate a warning#PRagma message "Warning 1"//Another way to generate a warning#warning "Warning 2"

兩種強制警告的方法在視覺效果上結果是一樣的,但是警告類型略有不同,一個是-W#pragma-messages,另一個是-W#warnings。對于第二種寫法,把warning換成error,可以強制使編譯失敗。比如在發布一些需要API Key之類的類庫時,可以使用這個方法來提示別的開發者別忘了輸入必要的信息。

//Generate an error to fail the build.#error "Something wrong"

對于關閉某個警告,如果需要全局關閉的話,直接在Other C Flags里寫-Wno-...就行了,比如-Wextra -Wno-sign-compare就是一個常見的組合。如果相對某幾個文件開啟或禁用警告,在Build Phases的Compile Source相應的文件中加入對應的編譯標識即可。如果只是想在某幾行關閉某個警告的話,可以通過臨時改變診斷編譯標記來抑制指定類型的警告,具體如下:

#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wunused-variable"int a;#pragma clang diagnostic pop

如果a之后沒有被使用,也不會出未使用變量的警告了。對于想要抑制的警告類型的標識名,可以在build產生該警告后的build log中看到。Xcode中的話,快捷鍵Cmd+7然后點擊最近的build log中,進入詳細信息中就能看到了。

警告的詳細信息,可以找到標識符

我應該開啟哪些警告提示

個人喜好(代碼潔癖)不同,會有不同的需求。我的建議是對于所有項目,特別是新開的項目,首先開啟-Wall-Wextra,然后在此基礎上構建項目并且避免一切警告。如果在開發過程中遇到了某些確實無法解決或者確信自己的做法是正確的話(其實這種情況,你的做法一般即使不是錯誤的,也會是不那么正確的),可以有選擇性地關閉某些警告。一般來說,關閉的警告項目不應該超過一只手能數出來的數字,否則一定哪兒出問題了..

是否要讓警告等于錯誤

一種很常見的做法和代碼潔癖是將警告標識為錯誤,從而中斷編譯過程。這讓開發者不得不去修復這些警告,從而保持代碼干凈整潔。在Xcode中,可以通過勾選相應的Treat Warnings as Errors來開啟,或者加入-Werror標識。我個人來說不喜歡使用這個設定,因為它總是打斷開發流程。很多時候并不可能把代碼全寫完再編譯調試,相反地,我更喜歡寫一點就編譯運行一下看看結果,這樣在中間debug編譯的時候會出現警告也不足為奇。另外,如果做TDD開發時,也可能會有大量正常的警告出現,如果有警告就不讓編譯的話,開發效率可能會打折扣。一個比較好的做法是只在Release Build時將警告視為錯誤,因為Xcode中是可以為Debug和Release分別指定標識的,所以這很容易做到。

另外也可以只把某些警告當作錯誤,-Werror=...即可,同樣地,也可以在-Werror被激活時使用-Wno-error=...來使某些警告不成為錯誤。結合使用這些編譯標識可以達到很好的控制。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二中文字幕在线看| 伊人久久大香线蕉av一区二区| 欧美精品一二区| 日韩av在线一区| 亚洲bt欧美bt日本bt| 韩国精品久久久999| 国产欧美日韩最新| 成人免费网站在线看| 国产精品视频99| 欧美激情一区二区三区高清视频| 精品久久久久人成| 欧美亚洲免费电影| 日韩高清欧美高清| 精品毛片三在线观看| 91精品国产91久久久久久| 亚洲精品456在线播放狼人| 亚洲国产黄色片| 狠狠做深爱婷婷久久综合一区| 一本色道久久88精品综合| 亚洲自拍另类欧美丝袜| 日韩精品在线视频观看| 国产女人精品视频| 欧美成人免费大片| 狠狠色香婷婷久久亚洲精品| 成人久久一区二区三区| 欧美超级免费视 在线| 欧美精品videossex性护士| 欧美性高跟鞋xxxxhd| 国产成人在线一区二区| 日韩欧美综合在线视频| 国产精品一区二区三区久久久| 久热99视频在线观看| 欧美性xxxxxx| 亚洲欧美日韩视频一区| 欧美在线观看日本一区| 91色琪琪电影亚洲精品久久| 国产精品国产亚洲伊人久久| 午夜剧场成人观在线视频免费观看| 国产精品久久久久久久久久99| 亚洲一区二区三区四区视频| 欧美性猛交xxxx免费看久久久| 最近2019中文免费高清视频观看www99| 国产日韩在线精品av| 国产精品久久久| 91精品国产电影| 精品亚洲夜色av98在线观看| 欧美有码在线观看视频| 久久国产精品视频| 国产亚洲欧美日韩美女| 热99久久精品| 欧美精品九九久久| 中文字幕在线成人| 欧美黄色片免费观看| 国产精品美女久久久久av超清| 欧美成人精品不卡视频在线观看| 欧美精品少妇videofree| 91影院在线免费观看视频| 97在线精品视频| 欧美最猛性xxxxx免费| 国产成人a亚洲精品| 国模精品视频一区二区三区| 欧美激情手机在线视频| 欧美性高潮床叫视频| 国产精品网站入口| 韩国一区二区电影| 欧美人交a欧美精品| 国产免费一区二区三区香蕉精| 亚洲字幕在线观看| 6080yy精品一区二区三区| 亚洲一区二区三区成人在线视频精品| 亚洲理论在线a中文字幕| 欧美大全免费观看电视剧大泉洋| 欧美午夜视频一区二区| 亚洲综合成人婷婷小说| 国产精品一区二区久久精品| 欧美激情欧美激情在线五月| 亚洲石原莉奈一区二区在线观看| 这里只有精品视频| 国产一区二区日韩| xvideos国产精品| 伊人精品在线观看| 亚洲国产天堂网精品网站| 日韩av片免费在线观看| 精品一区二区电影| 亚洲二区在线播放视频| 国产精品久久婷婷六月丁香| 精品视频久久久久久久| 日韩一区二区在线视频| 色噜噜狠狠狠综合曰曰曰88av| 国产va免费精品高清在线观看| 亚洲精品日韩欧美| 亚洲欧洲国产一区| 亚洲美女性视频| 91国内揄拍国内精品对白| 国产成人综合一区二区三区| 亚洲欧美一区二区三区在线| 亚洲wwwav| 这里只有精品视频| 国产亚洲视频在线| 久久精品中文字幕电影| 欧美激情二区三区| 欧美最猛性xxxxx(亚洲精品)| 福利精品视频在线| 北条麻妃99精品青青久久| 国产精品视频网| 国产精品欧美风情| 色妞欧美日韩在线| 日本高清视频一区| 欧日韩在线观看| 亚洲精品色婷婷福利天堂| 亚洲自拍偷拍色片视频| 精品国产一区二区三区在线观看| 久久全球大尺度高清视频| 国内精品久久久久久久| 成人免费观看a| 亚洲精品国产综合久久| 91在线视频九色| 色噜噜狠狠狠综合曰曰曰| 日韩乱码在线视频| xvideos亚洲人网站| 亚洲欧美中文日韩在线v日本| 久久97久久97精品免视看| 日韩中文字幕欧美| 亚洲社区在线观看| 国产精品第1页| 亚洲成人精品视频在线观看| 国产精品美女午夜av| 久久久亚洲成人| 日韩在线中文字| 亚洲成av人影院在线观看| 国产精品91在线观看| 欧美特级www| 欧美xxxx做受欧美.88| 另类色图亚洲色图| 午夜精品三级视频福利| 欧美成人午夜视频| 欧美视频在线观看 亚洲欧| 三级精品视频久久久久| 丝袜亚洲欧美日韩综合| 国产97在线亚洲| 亚洲综合中文字幕在线观看| 日韩av一区二区在线| 精品二区三区线观看| 日日噜噜噜夜夜爽亚洲精品| 热久久美女精品天天吊色| 在线成人激情视频| www.久久久久| 日本久久久久久久久久久| 九九久久久久久久久激情| 日韩高清不卡av| 国产999在线观看| 国产丝袜精品视频| 亚洲精品视频久久| 91国产精品电影| 中文字幕无线精品亚洲乱码一区| 4438全国成人免费| 性亚洲最疯狂xxxx高清| 亚洲精品有码在线| 亚洲精品理论电影| 欧美精品日韩三级| 亚洲自拍欧美色图| 亚洲成人激情图| 亚洲日韩中文字幕在线播放| 国产欧美久久久久久|