oky*_*eni 15 objective-c llvm-clang
Swift 2有API 可用性检查.
当您使用对于最小目标操作系统来说太新的API时,编译器会给您一个错误
为什么objective-c编译器不能做等效的?
我google了目标c API可用性检查,只有swift 2结果出来,所以我假设目标c的编译器不能这样做.
use*_*710 47
Xcode 9.0将Swift的运行时可用性检查语法带到Objective-C:
if (@available(macOS 10.9, *))
{
// call 10.9+ API
}
else
{
// fallback code
}
Run Code Online (Sandbox Code Playgroud)
这包括调用比部署目标更新的API的警告(如果这些调用未包含在检查中).
终于;)
hag*_*agi 20
警告(Swift使其成为错误)多年来一直没有在Clang编译器中实现,但它不是固有的Objective-C限制(尽管由于其动态特性,您将无法捕获所有情况) ,也不是斯威夫特的术语.
用于注释带有可用性信息的标头的Apple宏(例如NS_CLASS_AVAILABLE
)和源属性(__attribute__((visibility(...)))
,__attribute__((availability(...)))
)已存在多年,并且它们广泛用于Apple的SDK中.这些宏在Foundation
's NSObjCRuntime.h
和Availability.h
/ AvailabilityMacros.h
system头中定义,编译器可以(并且确实)读取它们.
在2015年初,-Wpartial-availability
警告已被添加到Clang的master
分支机构,但是这个提交/警告并没有进入Apple的Clang版本,直到(包括)Xcode 7.2.unknown warning option
在Xcode 7.2中向项目添加警告标志时,您将获得一个日志,但该标志在Xcode 7.3中可用.公司目前旗下有它没有预定义的设置,但您可以将标志添加到Other Warning Flags
下构建设置.
还有其他工具使用LLVM库来检测部分可用的API,例如,Deploymate.对于我的毕业论文,我开发了一个直接集成到Xcode中的工具,它基于对Clang编译器的修改.代码仍然在线,但我没有跟上一般的Clang开发,因此除了学习目的之外它没什么用处.但是,"官方"代码(上面链接的)更清洁,更好.
编辑:从Xcode 9开始,可用性检查也适用于Objective-C(和C).而不是使用上面提到的警告标志,它不支持临时/本地提升部署目标并因此导致大量误报-Wunguarded-availability
,并且if (@available(iOS 11, *)) {...}
检查并提升以下代码块的部署目标.它默认是关闭的,但默认情况下-Wunguarded-availability-new
会启用,并开始检查iOS/tvOS 11,watchOS 4和High Sierra之外的任何内容.有关详细信息,请参阅Xcode 9测试版发行说明,该说明目前需要使用开发者帐户登录.
归档时间: |
|
查看次数: |
11174 次 |
最近记录: |