我理解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,但我找不到任何可以接近的内容。
答案 0 :(得分:4)
是的,他们是不同的,他们的差异记录在案。使用isKindOfClass:
将为子类返回YES,而isMemberOfClass:
则不会。由于NSDictionary是一个类集群(在内部使用私有子类),因此在使用这两个类时会得到不同的结果(因为该实例将是一个私有子类(在您的情况下为__NSDictionaryI
)。
使用isMemberOfClass:
时,这就是您的情况:
item
是私有字典子类isMemberOfClass:
返回NO size
并引发异常。