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