2010-04-12 62 views
117

隨着所有SDK的漂移,可以方便地爲多個SDK和平臺構建。然而,反彈從3.2到3.0,甚至偶爾2.X,我經常得到涉及方法過時的警告,已經修改或取代:抑制Xcode中不推薦使用的警告

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated. 

因爲我還是希望保持與舊的操作系統的兼容性,和我在建築時也努力去除「噪音」,是否有辦法關閉或禁用這些警告?

+3

雖然保羅的r答案的作品,認爲manicaesar是多一點的手術,因爲它可以讓您精確地抑制你想要的警告,又不失其他額外的警告,這可能是非常重要的。在我看來,就最佳實踐而言,manicaesar擁有The Correct Answer™ – Olie 2013-01-18 04:23:35

回答

67

嘗試-Wno-deprecated-declarations,或其在Xcode中的相應設置,GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(專業提示:只需在構建設置中輸入「deprecated」即可找到此警告的特定設置)。

當前的Xcode的版本(如Xcode中9.2):

​​


古代版本的Xcode(如Xcode的2.X,3.X):

enter image description here

+17

發現它比這更容易; Xcode目標設置中有一個複選框;你的回答促使我在那裏搜索。謝謝! – 2010-04-12 14:20:22

+2

你也可以在每個文件的基礎上做到這一點。看到這個答案添加每個文件標誌:http://stackoverflow.com/a/6658549/272473 – mrwalker 2012-09-07 20:08:54

+4

這樣的答案令人沮喪的newbs。嘗試在哪裏?我如何找到目標設置?多一點解釋會增加這個答案的價值。 – noogrub 2012-10-14 11:36:33

25

您還可以通過使用

來抑制每個文件的警告

這反過來使它有點更好的做法,而不僅僅是壓制所有的警告一次和一起...畢竟你知道你在做什麼。

+0

Upvoted ...像魅力一樣工作 – NSPratik 2016-09-26 06:47:28

300

由於我還不能添加評論@samiq文章,我想我會擴大它。在您使用棄用的東西的函數/方法之前輸入提到的指令。

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
- (void) methodUsingDeprecatedStuff { 
    //use deprecated stuff 
} 
#pragma GCC diagnostic pop 
+1

非常棒!這就是我正在尋找+1 :) – 2011-01-02 04:16:51

+1

真棒小費!太糟糕了,它不能在方法中聲明。 – Dustin 2011-05-24 16:16:28

+12

其實它可以在方法中聲明。由於文檔/ sdk中的一個錯誤,我今天只需要執行+1 – jer 2012-07-22 20:49:28

131

鏘提供了一個很好的功能,使「恢復」,在@manicaesar獨立後的最初警告狀態的步驟:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
- (void) methodUsingDeprecatedStuff { 
    //use deprecated stuff 
} 
#pragma clang diagnostic pop 
然後您可以將功能結束後定義恢復以前的設置

引述鏘manual

除了所有的海灣合作委員會的編譯所提供的功能,鏘,您還可以推送和彈出當前的警告州。這在編寫由其他人編譯的頭文件時特別有用,因爲您不知道它們使用何種警告標誌。

+1

更新版本的GCC使用相同的語法(GCC的替代clang)。 – Niclas 2014-01-27 14:04:59

+2

我總是對LLVM,GCC和Clang感到困惑。所以,我想放下筆記以節省時間。 GNU編譯器集合(GCC)與Xcode 3一起使用,然後Apple發佈了帶有混合LLVM-GCC的Xcode 4。然後,低級虛擬機(LLVM)編譯器接手了,請參閱http://llvm.org上的更多信息。從Xcode 7.2.1開始,默認編譯器是Apple LLVM 7.0。 LLVM編譯器是其他「項目」,調試器和其他工具的庫,其中包括Clang本機編譯器。 Clang是「LLVM原生」C/C++/Objective-C編譯器。 – 2016-02-15 17:31:32

-2

要禁用來自第三方的頭文件警告,在文件的頂部

#pragma clang system_header 
36

因爲我們往往需要支持舊的操作系統,但要注意我們的警告,我想添加以下行更完整的方式來做到這一點。我把這個在一起,通過一些Mozilla的代碼啓發:

#define SILENCE_DEPRECATION(expr)         \ 
do {                \ 
_Pragma("clang diagnostic push")         \ 
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ 
expr;                \ 
_Pragma("clang diagnostic pop")          \ 
} while(0) 

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 

這可以讓你做到以下幾點:

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]); 

它還可以與代碼塊:

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self]; 
    view.lineWidth = self.lineWidth; 
    view.strokeColor = self.color; 
); 

而且,當你放棄對iOS 7之前的設備的支持時,你可以輕鬆地搜索代碼來找到不合適的用法來修復。

+0

對於大多數代碼而言,這是一個更好的長期解決方案,而不是在全球/項目級別縮減棄用(或任何其他)警告。了不起的答案。 – natbro 2014-10-25 20:38:29

+0

這是解決這個常見問題的一種非常性感的方式。我感謝你的努力。 – 2015-05-13 02:47:22

+0

作爲參考,這可以用於任何鐺選項...我個人使用它('-Wdeprecated-declarations')並禁用performSelector泄漏警告('-WperformSelector-leaks')。您只需在第二個'_Pragma'調用中相應地更改選項。 – 2015-07-14 14:27:18

5

在您的構建設置中,找到Deprecated Functions

enter image description here