Почему метод класса объекта класса не возвращает мета класс? - PullRequest
1 голос
/ 14 марта 2020

Следующий код:

  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.

1 Ответ

2 голосов
/ 14 марта 2020

meta1 является результатом вызова class для значения типа Class, то есть вызовы вызывают метод класса (+ class) - аналогично вызову [c alloc] (после присваивания c в коде) будет эквивалентно [NSObject alloc].

Реализация по умолчанию + class взята из NSObject и определена для простого возврата класса, в котором она была вызвана. Таким образом, в примере кода c и meta1 имеют значение NSObject Class.

Это говорит о том, что по определению meta1 не является мета-классом. Если ваш вопрос заключается в том, почему по замыслу он не возвращает метакласс, то это другой вопрос, который лучше всего задать одному из разработчиков языка!

HTH

...