如何简化Objective-C中适配旧系统的@available冗余空分支代码?
针对Objective-C @available 空分支冗余问题的解决方案
方案1:封装系统版本判断宏(最通用,兼容Xcode 12及更低版本)
这是目前生产环境使用最广泛的方案,基于NSProcessInfo的系统版本判断API(macOS 10.10及以上版本原生支持)封装宏,完全规避@available的反向判断警告:
首先预定义宏:
// 放在全局头文件中,比如PrefixHeader.pch #define MAC_OS_VERSION_LESS_THAN(ver) \ (![[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = ver, .minorVersion = 0, .patchVersion = 0}])
使用时直接调用即可,无需空分支:
if (MAC_OS_VERSION_LESS_THAN(11.0)) { // 旧系统兼容逻辑 }
如果你的应用需要适配 macOS 10.10 以下的极低版本,可以替换为NSAppKitVersion常量判断:
if (NSAppKitVersion < NSAppKitVersionNumber11_0) { // 旧系统兼容逻辑 }
方案2:临时压制编译警告
如果不想引入全局宏,也可以通过Clang编译指令临时压制反向@available的警告:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunguarded-availability" if (!@available(macOS 11.0, *)) { // 旧系统兼容逻辑 } #pragma clang diagnostic pop
方案3:升级Xcode版本(Xcode 13+已原生支持)
从Xcode 13版本开始,Clang已经修复了这个设计缺陷,直接对@available条件取反不会再触发@available does not guard availability here警告,可以直接写:
if (!@available(macOS 11.0, *)) { // 旧系统兼容逻辑 }
内容的提问来源于stack exchange,提问作者ATV
相关产品推荐
相关产品推荐

