我了解 isKindOfClass: 和 isMemberOfClass: 之间的区别,但我遇到了一些我不明白的事情:
-(UIImage *)doSomethingid)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 之类的其他帖子,但找不到更接近的内容。
是的,它们是不同的,并且它们的区别已记录在案。使用 isKindOfClass:
将为子类返回 YES,而 isMemberOfClass:
不会。由于 NSDictionary 是一个类集群(内部使用私有(private)子类),因此在使用两者时会得到不同的结果(因为实例将是私有(private)子类(在您的情况下为 __NSDictionaryI
)。
当使用 isMemberOfClass:
时,这就是你的情况:
item
是一个私有(private)字典子类isMemberOfClass:
返回 NOsize
并引发异常。关于ios - NSDictionary (__NSDictionaryI) isMemberOfClass : isKindOfCLass: difference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28069707/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |