【问题标题】:Why does class method of a class object does not return the meta class?为什么类对象的类方法不返回元类?
【发布时间】:2020-03-14 08:14:19
【问题描述】:

以下代码:

  NSObject *a = [[NSObject alloc] init];
  Class c = [a class];
  Class meta1 = [[a class] class];
  Class meta2 = objc_getMetaClass("NSObject");
  NSLog(@"%@ %d", c, class_isMetaClass(c));
  NSLog(@"%@ %d", meta1, class_isMetaClass(meta1));
  NSLog(@"%@ %d", meta2, class_isMetaClass(meta2));

生产:

NSObject 0
NSObject 0
NSObject 1

不止于此,[c isKindOfClass:c] 返回true

【问题讨论】:

    标签: objective-c objective-c-runtime


    【解决方案1】:

    meta1 是在 Class 类型的值上调用 class 的结果,即调用调用类方法 (+ class) - 与调用 [c alloc] 类似(在分配给 c 之后在代码中)相当于[NSObject alloc]

    + class 的默认实现来自 NSObject 并且是 defined 以简单地返回调用它的类。所以在示例代码中,cmeta1 的值都是 NSObjectClass

    这告诉你为什么定义 meta1 不是元类。如果您的问题是为什么按设计它不返回元类,那么最好向该语言的设计者提出一个不同的问题!

    HTH

    【讨论】:

    • 我推断,由于语言的设计者不希望我们在将类作为参数传递时按名称引用它们(如您提供的链接中所述),因此他们必须提供一种获取方式对没有实例的类的引用。现在我们为什么不能做 ` [self isKindOfClass:SomeClass];` 这是一个不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2018-10-19
    • 2012-05-04
    相关资源
    最近更新 更多