Apple は、コードで受け取ったコンパイル時の警告を認識していません。
はい、あなたはこの慣習を正しく扱っています。明らかに、この場合、5.0 より前の iOS をサポートしている場合にのみ、この作業を行う必要があります。ただし、一般に、メソッドを呼び出すことができるかどうかをテストしてから、適切なレンディションを呼び出す手法は完全に正しいものです。
警告をオフにしたい場合は、単に警告を一時的に抑制し、適切な#pragma
構文を使用して後でオンに戻します。
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
{
//post-iOS6.0
[self dismissViewControllerAnimated:YES completion:nil];
}
else
{
// pre-iOS6.0
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[self dismissModalViewControllerAnimated:YES];
#pragma clang diagnostic pop
}
ところで、特定の警告のコードを知りたい場合-W
は、ログ ナビゲーターに移動し、警告を含む最近のビルドを選択してログを展開すると、そこに表示されます。
また、上で説明したように警告を抑制することもできますが、実際にはそうする必要はほとんどないことに注意してください。あなたの例を使用すると、プロジェクトの iOS 展開ターゲットが 4.3 の場合、警告は表示されません。展開ターゲットが 6.0 以降の場合、その警告が表示されますがdismissModalViewControllerAnimated
、有効な iOS 5.0 では常にdismissViewControllerAnimated
.
コードでこの警告を抑制する必要があるのは、ソース コードが将来プロジェクトに含まれる場合で、展開ターゲットが不明な場合のみです。上記のコードが 4.3 展開ターゲットまたは 5.0+ 展開ターゲットのプロジェクトに含まれるかどうかがわからない場合は、例を使用してください。その場合、この構文は非常に便利です。しかし、繰り返しになりますが、条件付きチェックを使用することもできます__IPHONE_OS_VERSION_MIN_REQUIRED
。
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
{
//post-iOS5.0
[self dismissViewControllerAnimated:YES completion:nil];
}
else
{
// pre-iOS5.0
[self dismissModalViewControllerAnimated:YES];
}
#else
[self dismissViewControllerAnimated:YES completion:nil];
#endif