Ответ 1
-
Apple не знает о любых предупреждениях о компиляции, которые вы получаете с помощью своего кода.
-
Да, вы правильно относитесь к этой практике. Понятно, что в этом случае вам нужно только выполнить эти усилия, если вы поддерживаете iOS до 5.0. Но, в общем, метод проверки того, можно ли вызвать метод, а затем вызвать соответствующее преобразование, абсолютно корректен.
-
Если вы хотите отключить предупреждение, вы просто временно отключите предупреждение, а затем снова включите его, используя соответствующий синтаксис
#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