虽然这里苹果公司声明Swift available标志也应该应用在objc中,但它并不适用于我。我做错了什么?
我在Swift文件中有以下声明:
@objc protocol Readable: AnyObject {...}
@available(iOS 10.3, *)
@objc class Reader: NSObject, Readable {...}因此,当我尝试在没有版本检查的预IOS-10项目中初始化它时,让我们检查它是否会产生错误。如果我用Swift编写以下代码:
let tmp = Reader()它返回一个错误:
“阅读器”仅可在iOS 10.3或更高版本上使用
所期待的。
但是,如果我用objc编写以下代码:
// if (@available(iOS 10.3, *)) { // commeted out to test if it succeeds without version check
Reader *tmp = [[Reader alloc] init];
// }构建完成时没有出现任何错误,而我预计会出现与Swift中相同的错误。
我试着用:
在objc中,这两种方法都不能工作(产生错误)。有什么帮助吗?
发布于 2019-01-15 17:57:32
目的-C期__attribute__((availability))的发生时间比@available期长。为使其工作,Objective编译器弱链接部署目标上不可用的符号。这意味着编译总是成功的,启动应用程序也会成功,但是如果没有可用的代码,则在运行时这个符号将为NULL。
取决于它是什么,当您尝试使用它时,您会或多或少地得到优雅的降级:
测试在运行时是否找到符号的旧方法是将符号与NULL进行比较:
NS_AVAILABLE_MAC(...) @interface Foo @end
int bar NS_AVAILABLE_MAC(...);
int baz(int frob) NS_AVAILABLE_MAC(...);
if ([Foo class]) { /* Foo is available */ }
if (&bar) { /* bar is available */ }
if (&baz) { /* baz is available */ }就你而言:
Reader *tmp = [[Reader alloc] init];tmp将是nil,因为这将与[[nil alloc] init]相同。
@available指令直到最近才被添加到目标C中。现在可以在Objective中使用@available,就像在Swift中使用#available一样。然而,为了保持向后兼容性,尝试使用目标C中的部署目标上可能不可用的符号,可能永远不会是编译时错误(在默认错误级别上)。
https://stackoverflow.com/questions/54203615
复制相似问题