Xcodeで非推奨の警告を抑制する


133

すべてのSDKが浮かんでいるので、複数のSDKとプラットフォーム用にビルドできると便利です。ただし、3.2から3.0に、場合によっては2.xにバウンスすると、変更または置き換えられたメソッドに関する非推奨の警告が頻繁に表示されます。

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

古いOSとの互換性を維持したいので、ビルド時に「ノイズ」を除去しようと努力しているので、これらの警告をオフまたは無効にする方法はありますか?


4
Paul Rの回答は機能しますが、マニカイザーはもう少し外科的であると考えてください。これにより、重要な他の追加の警告を失うことなく、必要な警告を正確に抑制できます。ベストプラクティスの観点から見ると、manicaesarには正しい答えがあります
Olie

回答:


82

-Wno-deprecated-declarations、またはXcodeの対応する設定を試してくださいGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(プロヒント:ビルド設定に「非推奨」と入力するだけで、この警告の特定の設定を見つけることができます)。

Xcodeの現在のバージョン(Xcode 9.2など):

ここに画像の説明を入力してください


Xcodeの古いバージョン(Xcode 2.x、3.xなど):

ここに画像の説明を入力してください


17
それはそれよりもさらに簡単であることがわかりました。Xcodeターゲット設定にチェックボックスがあります。あなたの答えは私をそこで検索するように促しました。ありがとう!
ベンゴットリーブ

4
これをファイルごとに行うこともできます。ファイルごとのフラグの追加については、この回答を参照してください:stackoverflow.com/a/6658549/272473
mrwalker

4
このような答えは、初心者にとってイライラします。どこで試してみる?ターゲット設定を見つけるにはどうすればよいですか?もう少し説明すると、この回答の価値が高まります。
noogrub 2012年

8
この不十分に説明された答えは、正しいものとしてマークされるべきではありません。
Chris Hatton

6
ビルド設定で「非推奨」を検索すると、表示されます。
クォンタムポテト2014

337

@samiqの投稿にはまだコメントを追加できないので、拡大すると思います。非推奨のものを使用する関数/メソッドの前に、言及されたディレクティブを入力します。次に、関数の定義が終了した後で、以前の設定を復元できます。

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

1
優れた!これは私が+1を探していたものです:)
Zoran Simic

1
素晴らしいヒント!メソッド内では宣言できません。
ダスティン

12
実際には、メソッド内で宣言できます。私はちょうどドキュメント/ SDKのバグにより、今日それをしなければならなかった
JER

6
1 Aはわずかに良い方法はとの構文を使用することで #pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop 、このメソッドが戻って前に設定されたものは何でも設定に表示されますよう.. [ gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
ニクラス

3
提案
に従って

143

Clangは、@ manicaesarポストの「復元」ステップを初期の警告状態とは無関係にする優れた機能を提供します。

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

Clang マニュアルを引用するには:

GCCのプラグマによって提供されるすべての機能に加えて、Clangでは現在の警告状態をプッシュおよびポップすることもできます。これは、他の人がコンパイルするヘッダーファイルを作成するときに特に役立ちます。これは、他の人が作成する警告フラグがわからないためです。


1
GCCの最近のバージョンでは同じ構文を使用しています(GCCをclangに置き換えてください)。
Niclas 2014年

3
LLVM、GCC、Clangとは何なのかといつも混乱します。それで、時間を節約するためにメモを落としたかったのです。GNU Complier Collection(GCC)がXcode 3で使用された後、AppleはハイブリッドLLVM-GCCを備えたXcode 4をリリースしました。その後、低レベル仮想マシン(LLVM)コンパイラが引き継ぎました。詳細については、llvm.orgをご覧ください。Xcode 7.2.1以降、デフォルトのコンパイラはApple LLVM 7.0です。LLVMコンパイラは、Clangネイティブコンパイラを含む他の「プロジェクト」、デバッガ、およびその他のツールのライブラリです。Clangは「LLVMネイティブ」のC / C ++ / Objective-Cコンパイラです。
serge-k

42

私たちは古いOSをサポートする必要がある傾向がありますが、警告に注意を払うため、これを行うためのより整然とした方法が必要でした。これをまとめて、いくつかの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より前のデバイスのサポートを終了すると、コードを簡単に検索して、修正する非推奨の使用法を見つけることができます。


これは、グローバルレベルまたはプロジェクトレベルで非推奨(またはその他の)警告を制限するよりも、ほとんどのコードにとってはるかに優れた長期的なソリューションです。素晴らしい答え。
natbro 2014年

1
なぜdo { ... } while(0);必要なのですか?
Ben Leggiero 2016年

1
@ BenC.R.Leggieroは、これらの括弧の間にブロックではなくいくつかのステートメントを渡すためです。基本的に、すべての行の警告を抑制しています。
AlejandroIván16年

1
@AlejandroIván私はあなたの説明があなたにとって理にかなっていることを知っています...しかし私には、あなたが質問を言い換えているように見えます。do{...}while(0);特にここで特に必要な理由を説明できますか?なぜ{...}ですか?なんでif(true){...}?など
Ben Leggiero

2
@ BenC.R.Leggiero正解です。どういうわけか私はあなたの質問を読み間違えました。ここでは受け入れ答えをチェック:stackoverflow.com/questions/154136/...
アレハンドロイバン・

29

次のコマンドを使用して、ファイルごとの警告を抑制することもできます。

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

これは、すべての警告を一度にまとめて抑制するよりも少し良い習慣になります...結局のところ、何のためにそれをしているのかを知ることができます。


20

警告Implementing deprecated methodまたはImplementing deprecated classを停止する場合は、次を使用します。

    #pragma clang診断プッシュ
    #pragma clang診断で無視された「-Wdeprecated-implementations」
    //コード
    #pragma clang診断ポップ


「-Wdeprecated-declarations」を見たとき、「-Wdeprecated-implementations」があるはずだと思います。そして、それは本当に機能します。ありがとうございました。
DawnSong


2

包括的なチェックが必要な場合は、コード内のすべての種類の非推奨を確認してください。以下のような-Wdeprecatedフラグを使用してください:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop

-3

サードパーティのヘッダーファイルからの警告を無効にするには、ファイルの先頭に次の行を追加します

#pragma clang system_header
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.