NSDictionary(__ NSDictionaryI)isMemberOfClass:isKindOfCLass:差异

时间:2015-01-21 14:32:44

标签: ios

我理解isKindOfClass:和isMemberOfClass之间的区别:但我遇到了一些我不理解的东西:

-(UIImage *)doSomething:(id)item 
{

    UIImage *image;

    if ([item isKindOfClass:[NSDictionary class]]) {
        NSDictionary *dictionary = item;
        NSData *data = [dictionary objectForKey:@"image"];
        image = [[UIImage alloc] initWithData:data];
    } else { // if item is UIImage
        image = item;
    }

    return image;
}

如果我在这个上下文中使用isKindOfClass,一切都按预期工作。如果我使用isMemberOfClass,我会在稍后询问图像的大小:

-[__NSDictionaryI size]: unrecognized selector sent to instance 0x123456

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI size]: unrecognized selector sent to instance 0x123456'

我读过其他帖子,例如this one,但我找不到任何可以接近的内容。

1 个答案:

答案 0 :(得分:4)

是的,他们是不同的,他们的差异记录在案。使用isKindOfClass:将为子类返回YES,而isMemberOfClass:则不会。由于NSDictionary是一个类集群(在内部使用私有子类),因此在使用这两个类时会得到不同的结果(因为该实例将是一个私有子类(在您的情况下为__NSDictionaryI)。

使用isMemberOfClass:时,这就是您的情况:

  1. 参数item是私有字典子类
  2. 评估isMemberOfClass:返回NO
  3. 将字典分配给UIImage变量
  4. 返回UIImage变量(但它确实包含字典)
  5. 您尝试使用该“图像”,当系统询问图像大小时,字典不响应size并引发异常。