NSDate isMemberOfClass: [NSDate class] returns 假?

NSDate isMemberOfClass: [NSDate class] returns false?

这很奇怪。以下 if 语句失败。有什么问题吗?

 NSDate *date = [NSDate date];

 if ([date isMemberOfClass: [NSDate class]]) {
    // Not executed.
 }

NSDate is a class cluster.

这意味着当您尝试在下面执行此操作时,它是不同的 class(NSDate 的具体实现):)

更多关于class clusters here

碰巧 class 像 NSArrayNSDictionaryNSStringNSData 是 class 个集群。这个概念在 documentation,表示不会得到直接实例 为此 class.

由于要处理的 "data" 种类繁多,class 具有内部 专门子classes;当你创建一个实例时,它将是 确定这些内部 subclasses 中的哪一个是最佳选择,并且 然后你的对象将是那个 subclass 的实例(不是 NSData 本身)。

在这种情况下,如果您需要检查,请使用 isKindOfClass: 对于 subclasses 也是如此。

NSDate *date = [NSDate date];

if ([date isKindOfClass: [NSDate class]]) {
    /* ... */
}

编辑: 再举一个例子,调用 NSStringFromClass([obj class]) 在这些对象中:

NSData   * data     = [NSData data];
NSData   * str_data = [@"string" dataUsingEncoding:NSUTF8StringEncoding];
NSNumber * n_bool   = [NSNumber numberWithBool:YES];
NSNumber * n_int    = [NSNumber numberWithInt:42];
NSArray  * array    = [NSArray array];

结果:

_NSZeroData
NSConcreteMutableData
__NSCFBoolean
__NSCFNumber
__NSArrayI