gpt4 book ai didi

ios - NSDictionary (__NSDictionaryI) isMemberOfClass : isKindOfCLass: difference

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:41:29 25 4
gpt4 key购买 nike

我明白 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 等其他帖子,但找不到任何更接近的帖子。

最佳答案

是的,它们是不同的,并且它们的区别已记录在案。使用 isKindOfClass: 将为子类返回 YES 而 isMemberOfClass: 则不会。由于 NSDictionary 是一个类簇(在内部使用私有(private)子类),因此在使用两者时会得到不同的结果(因为实例将是一个私有(private)子类(在您的情况下为 __NSDictionaryI)。

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

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

关于ios - NSDictionary (__NSDictionaryI) isMemberOfClass : isKindOfCLass: difference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28069707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com