首页 > 解决方案 > Why does class method of a class object does not return the meta class?

问题描述

The following code:

  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));

produce:

NSObject 0
NSObject 0
NSObject 1

More than that [c isKindOfClass:c] returns true.

标签: objective-cobjective-c-runtime

解决方案


meta1是调用class类型值的结果Class,即调用调用类方法 ( + class) - 类似地,调用[c alloc](在代码中赋值之后c)将等效于[NSObject alloc].

的默认实现+ class来自NSObject并被定义为简单地返回调用它的类。因此,在示例代码中,两者都c具有meta1as valueNSObjectClass

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

高温高压


推荐阅读