以下代码:
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
。
meta1
是对类型为class
的值调用Class
的结果,即,调用将调用类方法(+ class
)–类似地,调用[c alloc]
(在将c
分配给代码)等同于[NSObject alloc]
。
+ class
的默认实现来自NSObject
,并且是defined以仅返回被调用的类。因此,在示例代码中,c
和meta1
的值均为NSObject
的Class
。
这告诉您为什么按定义meta1
不是元类。如果您的问题是按设计原因而不返回元类,那么最好是该语言的一位设计师提出的另一个问题!
HTH