为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?

Posted

技术标签:

【中文标题】为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?【英文标题】:Why am I getting "[__NSArrayI allKeys]: unrecognized selector sent to instance" / why is NSDictionary transforming?为什么我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为什么 NSDictionary 正在转换? 【发布时间】:2013-07-31 22:10:50 【问题描述】:

查看此[__NSArrayI allKeys]: unrecognized selector sent to instance 错误,当您向 NSArray 发送用于 NSDictionaryallKeys 消息时,它似乎会发生,但在这种情况下,我非常清楚地将其发送到 NSDictionary。

这是我与 Pocket API 交互时使用的代码:

        NSDictionary *articles = [response objectForKey:@"list"];

        // Create an array we can use to sort the keys (and thus the articles) in order of when they were added
        NSMutableArray *allKeys = [[articles allKeys] mutableCopy];

最后一行导致错误。但是articles 被非常明确地声明为 NSDictionary?为什么不喜欢呢?

奇怪的是,如果我在运行时检查它,它会说它是一个 NSArray!为什么变了?

(lldb) po articles
$5 = 0x082103e0 <__NSArrayI 0x82103e0>(

)

(lldb) po [articles class]
$6 = 0x01b83b8c __NSArrayI
(lldb) 

【问题讨论】:

将指针命名为 NSMutable 数组 allKeys 可能有问题。看到这是一个方法名称,它可能会导致问题。另外,你能澄清一下[response ... 是什么吗? response 是来自 Pocket API 的 JSON 响应。 【参考方案1】:

它可能在您的代码中被声明为字典,但这并不能使它成为字典。它确实是一个数组,这就是你得到异常的原因。检查你的response,这样你就知道你应该期待什么。

您的代码可以编译,因为编译器不知道它将成为一个数组,并且它相信您它将成为一个字典。这样做是因为objectForKey: 返回id

【讨论】:

po [response class] 输出 $4 = 0x01b83e34 __NSCFDictionary 虽然? 是的,响应是字典,但这并不意味着它包含的所有内容也是字典。 啊,很公平。通常articlesNSDictionary,当它有很多来自响应的对象,但当它不包含任何对象时,它似乎被视为NSArray,对吧?我刚查了一下,当大量物品进来时,我得到了这个:(lldb) po [articles class]; $3 = 0x01b83e34 __NSCFDictionary 最好加个检查类型然后计数。 太好了,在我进一步修复之前简单检查一下articles.count == 0。谢谢你的知识。 :)

以上是关于为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我没有得到授权标头?

为啥我得到一个零数组

为啥我得到一个 nullPointerException? [复制]

为啥我没有得到任何回应

为啥我得到黑色纹理?

为啥我得到分段(核心转储)?