【问题标题】:In Objective C, how to obtain the metaclass object?在Objective C中,如何获取元类对象?
【发布时间】:2014-01-16 23:04:02
【问题描述】:

Objective-C中,如何获取元类对象? [self class][ClassName class] 都只返回 Class 对象。

【问题讨论】:

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


    【解决方案1】:

    objc_getMetaClass

    编辑:根据 Greg 在 cmets 中的建议进行了改进。

    object_getClass([Class class]);
    

    【讨论】:

    • 不要这样做。它在某些情况下会中断(例如两个具有相同名称的类)。
    • @qegal:Greg Parker 是 Objective-C 运行时的开发者之一。如果他说有风险,我会很犹豫。
    • @GregParker 谢谢,改进了答案。
    【解决方案2】:
    object_getClass([self class])
    object_getClass([ClassName class])
    

    【讨论】:

      【解决方案3】:

      您可能必须使用 Objective-C 运行时函数 object_getClass 来获取类对象的类。

      一篇好的文章What is a meta-class in Objective-C 详细介绍了元类。但是,在某些情况下,元类的类就是类本身。

      【讨论】:

        【解决方案4】:

        您是否希望获取用于元编程/反射的信息?

        此信息可通过plain-C API 获得。

        与其他一些面向对象的语言不同,元类本身的信息非常少,其他 C 函数填充了细节。

        如果您是 Objective-C、C 和 C++ 的新手,使用 Mike Ash 的 Objective-C wrapper library 可能会更容易。

        【讨论】:

          【解决方案5】:

          您可以通过

          获取对象的元类
          [[self class] class]
          

          [self 类] 产生一个指向 Class 对象的指针(即 isa 指针指向的内容)。由于这也是一个带有类的对象,所以可以再次按照 isa 指针获取元类。

          您可以在此博客文章 (http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html) 和 another post 中找到一个图表 (http://www.sealiesoftware.com/blog/class%20diagram.pdf),以不同方式解释它。对不起,奇怪的链接,但我不得不通过声誉过滤器......

          我很想知道你为什么想要一个指向元类的指针...

          【讨论】:

          • [[self class] class] 返回与 [self class] 相同的实例
          猜你喜欢
          • 1970-01-01
          • 2014-01-21
          • 1970-01-01
          • 1970-01-01
          • 2014-01-25
          • 2010-10-19
          • 2016-02-05
          • 2011-10-01
          相关资源
          最近更新 更多