[ClassName class]在幕后发生了什么?(涉及IT技术)

3
我们使用[ClassName class]来检查弱链接类或者新版本iOS中的类。[ClassName class]在背后是如何运作的?它是否通过NSClassFromString进行操作?

1
如果你想要弱链接,我相信 [ClassName class] 不会起作用。你已经有了一个链接到类符号的引用,所以你不能使用它。你需要使用 NSClassFromString() - nielsbot
第一个编译并链接类引用,第二个不假设类的可用性。所以,[ClassName class] 可能不使用 NSClassFromString() - nielsbot
据我所知,它将编译和链接成功。@nielsbot It will compile and link - user529758
好的,是的,如果你为相关框架打开了弱链接。不过我从未使用过这种方法... - nielsbot
我可以使用它来测试存在于较新iOS SDK(例如UIKit)中但不存在于旧版本中的类吗?这不需要任何弱链接。 - Boon
+[NSObject class] 只是 return self; - jscs
2个回答

2
请记住,在 Obj-C 中,您可以向 nil 发送消息。
我怀疑发生的情况是,在运行时加载 ClassName 之前它是 nil。如果它从未被加载过,那么您基本上是将类消息发送到了 nil,根据文档,这将返回 0/nil。
根据文档:
这是可行的,因为如果一个弱链接的类不可用,向其发送消息就像向 nil 发送消息一样。如果你对一个弱链接的类进行子类化,而超类不可用,则子类也看起来不可用。
重要的是,为了使此功能正常工作,框架必须支持其类上的 NS_CLASS_AVAILABLE(10_5, 2_0) 宏。

0
这里有几件事情。弱链接只是告诉LLVM(-weak_framework <framework_name>)不用担心符号和优化。苹果建议在支持之前的运行时SDK时启用此选项。您无法对SDK中不存在的框架进行弱链接。
至于[ClassName class],它既不是NSString也不是桥接计数器部分CFStringRef。它是Objective-C类元数据。
typedef struct objc_object {
    Class isa;
} *id;

身份验证通过NS_CLASS_AVAILABLE宏进行测试,该宏扫描所有从运行时元数据派生的对象。

苹果文档参考 https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3


我非常确定 [ClassName class] 返回的是一个 Class(又称为 typedef struct objc_class *Class;),而不是一个 objc_object(又称为 *id)。 - Brad Allred
@BradAllred 是正确的,实际上是这样的:@interface NSObject <NSObject> { Class isa; } - Justin Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接