我们使用[ClassName类]来检查新版iOS中的弱链接类或类。 [ClassName class]引擎盖下发生了什么?它是否通过NSClassFromString?
答案 0 :(得分:2)
请记住,在obj-c中,您可以向nil发送消息。
我怀疑发生的事情是ClassName是nil,直到它被运行时加载。如果它从未被加载,那么你基本上是将类消息发送到nil,根据文档返回0 / nil。
根据the docs:
这是有效的,因为如果弱链接类不可用,向它发送消息就像向nil发送消息。如果您子类化弱链接类并且超类不可用,则子类也将显示为不可用。
重要的是,要使其工作,框架必须支持其类的NS_CLASS_AVAILABLE(10_5, 2_0)
宏。
答案 1 :(得分:0)
这里发生了一些事情。弱链接只是告诉LLVM(-weak_framework <framework_name>
)不要担心符号和优化。 Apple建议在支持以前的未来运行时SDK时启用此选项。您不能弱链接到SDK中不存在的框架。
至于[ClassName class]
,它不是NSString
,也不是免费桥接对等CFStringRef
。这是Objective-C类元数据
typedef struct objc_object {
Class isa;
} *id;
通过NS_CLASS_AVAILABLE
宏测试身份,该宏扫描从运行时元数据派生的所有对象。