2011-06-26 38 views
6

我的項目中有一些不推薦的常量。他們需要留下來。我不想被警告,但是如果其他不贊成使用的常量稍後會出現在我的項目中,則需要警告。Xcode/iOS - 擺脫特定常量的棄用警告?

蘋果的頭部聲明它們如下:

extern NSString * const NameOfStringConstant __OSX_AVAILABLE_BUT_DEPRECATED(version availability info here) 

我怎麼能沉默的警告?

沉默警告的方法已過時here
相關答案沉默有關棄用的字符串轉換here

回答

1

正確回答這個問題的警告相關答案是不使用過時的常量。查看文檔以獲得推薦的方式來完成一些事情。在不推薦使用的方法/常量/其他方面,如果您願意的話,幾乎總是有一個「替換」的鏈接。改爲使用它。這樣,當這些代碼永遠消失時,你的代碼並不會神祕地破裂,但是你的用戶仍然有一個針對舊的sdk構建的構建,現在他們的代碼崩潰了,或者更糟糕的是,它們會發生奇怪的事情。

+6

我必須使用這些常量,因爲早期版本的iOS沒有不推薦使用的常量。我會檢查是否存在未棄用的存在,並在可用的情況下使用它。否則,我不得不退回不推薦使用的常量。 Apple的示例代碼也是這樣做的。 –

+0

有多早?不要告訴我你是支持3.x的人之一嗎?根據大多數人的帳戶,只有不到2%的用戶使用iOS 3.x(同樣也是iPad用戶),而實際上有不到40%的用戶使用* CAN RUN * iOS 3.x – jer

+1

在4.0中引入 –

2

添加到編譯器標誌:

-Wno-deprecated-declarations 

,或者在Xcode中,選擇「否」,爲構建設置選項:

Warn About Deprecated Functions 

,然後如果你看一下編譯輸出(蘋果在Xcode 4中+7),你會注意到前面提到的編譯器標誌。

1

這是#1在谷歌的答案,我相信有一些不公平的情況下使用不推薦的方法是有用的,當你想避免警告,以保持構建「乾淨」。這個解決方案的靈感來自於:http://vgable.com/blog/2009/06/15/ignoring-just-one-deprecated-warning/

這個想法是聲明一個新的協議,它具有相同的方法(當然不會棄用),並將該對象轉換爲該協議。通過這種方式,您可以調用該方法而不會收到警告,也無需清除所有棄用警告。

例如:如果您想在應用程序中集成TestFlight,則SDK文檔建議在BETA中傳輸設備的uniqueIdentifier。這可以幫助追蹤哪個測試者有問題。此方法已被Apple棄用(他們不會讓您提交應用程序),但我相信這是使用不推薦方法的一個很好的示例。

在應用程序委託:

/* This is to avoid a warning when calling uniqueIdentifier for TestFlight */ 
@protocol UIDeviceHack <NSObject> 

- (NSString*) uniqueIdentifier; 

@end 


@implementation MyAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [TestFlight takeOff:@"Your-Testflight-team-id"]; 
    // TODO: Remove this in production (forbidden APIs) - Used here to improve beta reporting. 
    [TestFlight setDeviceIdentifier:[(id<UIDeviceHack>)[UIDevice currentDevice] uniqueIdentifier]]; 

    // ... 
} 
+0

問題是關於常量。 –

+0

確實......對不起。它仍然在我的谷歌搜索中第一次出現。可能幫助某人。感謝您的反饋。 – sarfata

+0

+1:很好:)我仍然會使用[這個配方](http://blog.goosoftware.co.uk/2012/04/18/unique-identifier-no-warnings/) –

23

我知道這是一個老話題,但今天,我正在處理相同的煩惱。

示例:您希望擺脫惱人的棄用警告,但僅適用於[[UIDevice currentDevice] uniqueIdentifier]],因爲您很可能想在TestFlight的開發階段使用它。 如果您錯誤地使用了一些其他棄用的聲明,您仍然希望編譯器警告您。

我喜歡sarfata's answer:它的工作。但還有更多政治正確可用方式:

以下配方取自The Goo Software Blog

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    [TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]]; 
#pragma clang diagnostic pop 

確保你在建立分配之前註釋掉這行。或者只需使用預處理器宏從發佈版本中排除此行。