弱链接 - 检查类是否存在并使用该类
我正在尝试创建一个通用的 iPhone 应用程序,但它使用仅在较新版本的 SDK 中定义的类。该框架存在于较旧的系统上,但框架中定义的类不存在。
我知道我想使用某种弱链接,但是我能找到的任何文档都讨论了函数存在的运行时检查 - 如何检查类是否存在?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
TLDR
当前:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
旧版:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
Swift 2+
尽管历史上建议检查功能(或类存在)而不是特定的操作系统版本,但这在 Swift 2.0 中效果不佳,因为引入了 可用性检查。
请改用这种方式:
注意:如果您尝试使用
objc_getClass()
,您将收到以下错误:早期版本的 Swift
请注意,
objc_getClass()
比NSClassFromString( 更可靠) )
或objc_lookUpClass()
。Objective-C、iOS 4.2+
请参阅 code007 的答案了解更多详细信息。
OS X 或以前版本的 iOS
使用
NSClassFromString()
。如果返回nil
,则该类不存在,否则返回可以使用的类对象。这是 Apple 在本文档中推荐的方式:
TLDR
Current:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
Legacy:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
Swift 2+
Although historically it's been recommended to check for capabilities (or class existence) rather than specific OS versions, this doesn't work well in Swift 2.0 because of the introduction of availability checking.
Use this way instead:
Note: If you instead attempt to use
objc_getClass()
, you will get the following error:Previous versions of Swift
Note that
objc_getClass()
is more reliable thanNSClassFromString()
orobjc_lookUpClass()
.Objective-C, iOS 4.2+
See code007's answer for more details.
OS X or previous versions of iOS
Use
NSClassFromString()
. If it returnsnil
, the class doesn't exist, otherwise it will return the class object which can be used.This is the recommended way according to Apple in this document:
对于使用 iOS 4.2 或更高版本的基础 SDK 的新项目,有一种新的推荐方法,即使用 NSObject 类方法在运行时检查弱链接类的可用性。即
来源: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3
这个机制使用 NS_CLASS_AVAILABLE 宏,该宏可用于 iOS 中的大多数框架(请注意,可能有一些框架尚不支持 NS_CLASS_AVAILABLE - 请查看 iOS 发行说明)。可能还需要额外的设置配置,可以在上面提供的 Apple 文档链接中阅读,但是,此方法的优点是您可以进行静态类型检查。
For new projects that uses a base SDK of iOS 4.2 or later, there is this new recommended approach which is to use the NSObject class method to check the availability of weakly linked classes at run time. i.e.
source: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3
This mechanism uses the NS_CLASS_AVAILABLE macro, which is available for most framework in iOS (note there may be some framework that do not yet support the NS_CLASS_AVAILABLE - check the iOS release note for this). Extra setting configuration may also be needed that can be read in the Apple's documentation link provided above, however, the advantage of this method is that you get static type checking.