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

时间:2014-01-03 11:32:33

标签: ios objective-c metaclass objective-c-runtime

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

Class myMetaClass = objc_getMetaClass("NSString");

或者:

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

  • 正如第一个回答者在这里链接的另一篇文章所述:

请告诉我 为什么(????) objc_getMetaClass(); 打破 案件详细。

  • 在不同场景中使用它们的正确方法。

谢谢。

2 个答案:

答案 0 :(得分:4)

这两个函数都是正确的,但objc_getMetaClass("NSString")仅在向目标C运行时注册NSString时才有效。如果你想得到它的元类,它几乎总是如此。

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

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

答案 1 :(得分:2)

不同之处在于,第二个函数返回指定类的对象,第二个函数返回指定类的元类的对象...:)

如果没有注册类以便第二次检查,它们都会调用类处理程序回调。当你调用元类函数时,你将得到一个返回结果。

  

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

我认为您真正的问题是:类和元类之间有什么区别? 请看一下这个出色的解释: What is meta-class in objective-c