NSDate是MemberOfClass:[NSDate class]返回false?

时间:2015-09-08 19:33:43

标签: ios objective-c class nsdate

这是奇怪的。以下if语句失败。可能有什么不对?

 NSDate *date = [NSDate date];

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

2 个答案:

答案 0 :(得分:4)

类似于NSArrayNSDictionaryNSStringNSData是类集群。这个概念在中更好地解释了 documentation,这意味着您不会获得直接实例 对于那个班级。

由于要处理的“数据”种类繁多,所以该类具有内部功能 专门的子类;当你创建一个实例时,它将是 确定哪些内部子类是最佳选择,以及 那么你的对象将是该子类的一个实例(不是NSData的实例 本身)。

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

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

答案 1 :(得分:0)

  

NSDate是一个类集群。

这意味着当你尝试在它下面执行它的不同类(NSDate的具体实现):)

更多关于class clusters here