Деталь приближается.
Во-первых, в objc.h
мы можем найти эти коды:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
означает, что все Objective-C class
имеют тип Class
, включая NSObject
.
твой вопрос:
[arr addObject:[NSObject class]]; /// YES
[arr addObject:[NSValue class]]; /// YES
[arr addObject:[NSNumber class]]; /// YES
[arr addObject:[NSPredicate class]]; /// YES
[arr addObject:@"not a class object"]; /// NO, It's just a NSString.
Во-вторых, как вы упомянули, «Class
- это не objective-c class
, это структура». Я хочу объяснить, что все objective-c class
на самом деле Struct
в C.
В runtime.h
я нахожу эти коды, возможно, поможет нам:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
Наконец, давайте подойдем к NSObject.h
line30--32
, этим трем методам. Мы можем знать, что aClass
является Class
типом. Это дополнительно показывает, что весь класс target-c имеет тип Class
.
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
Я почти впервые отвечаю на вопрос на моем плохом английском. Если у вас также есть какие-либо вопросы, пожалуйста, ответьте в ближайшее время, я постараюсь объяснить это. И я также предлагаю вам прочитать NSObject.h
, runtime.h
, objc.h
код, может быть, это поможет вам.