iOS / Objective-C:获取元类对象的正确方法

问题描述 投票:10回答:2

以下哪一项是获取元类的正确方法?

Class myMetaClass = objc_getMetaClass("NSString");

或:

Class myMetaClass = object_getClass([NSString class]);
  • 它们两者有什么不同吗?

  • 正如在第一个答复者链接的另一篇文章中提到的:

请告诉我为什么 objc_getMetaClass();在某些情况下会详细地[[break。

    在不同情况下使用它们的正确方法。
ios objective-c metaclass objective-c-runtime
2个回答
4
投票
两个功能都正确,但是只有在目标C运行时中注册了objc_getMetaClass("NSString")时,NSString才有效。如果要获取其元类,几乎总是这样。

但是如果您使用Class myClass = objc_allocateClassPair(superClass,"my_own_class",0)创建一个类,情况会略有不同。

my_own_class尚未注册,因此,如果您需要访问元类(以添加类方法),则必须使用object_getClass(myClass)objc_getMetaClass("my_own_class")将返回nil


2
投票
不同之处在于,第二个函数返回命名类的对象,第二个函数返回命名类的元类的对象...:)

如果没有注册该类以进行第二次检查,它们两者都将调用类处理程序回调。当您调用元类函数时,您将获得返回结果。

...(但是,每个类定义必须具有有效的元类定义,因此总是返回元类定义,是否有效。)来自:Objective-C Runtime Reference

我认为您真正的问题是:

类和元类之间有什么区别?请看一下这个出色的解释:What is meta-class in objective-c

© www.soinside.com 2019 - 2024. All rights reserved.