[ClassName class]引擎盖下发生了什么?

时间:2013-10-22 22:50:28

标签: objective-c objective-c-runtime

我们使用[ClassName类]来检查新版iOS中的弱链接类或类。 [ClassName class]引擎盖下发生了什么?它是否通过NSClassFromString?

2 个答案:

答案 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宏测试身份,该宏扫描从运行时元数据派生的所有对象。

Apple Doc Ref https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3