目标c [__NSArrayM objectForKey:]:发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】目标c [__NSArrayM objectForKey:]:发送到实例的无法识别的选择器【英文标题】:objective c [__NSArrayM objectForKey:]: unrecognized selector sent to instance 【发布时间】:2017-10-13 10:36:42 【问题描述】:

我声明 DATA 如下

@property(强,非原子)NSDictionary *DATA;

我在控制台 DATA 中的表是:

(
    
    comment = "";
    deadline = deadline;
    id = 2;
    responsible = "responsable action 1";
    status = pending;
    title = "";

)

但是NSLog(@"%@",[DATA objectForKey:@"deadline"]);有问题

【问题讨论】:

看起来您的 DATA 包含字典数组,而不仅仅是字典。检查您为此属性设置值的代码。 试试这个:NSLog(@"%@",[DATA[0] objectForKey:@"deadline"]); 【参考方案1】:

您正在将此DATA 对象用作NSDictionary,但它是NSArray。您可以查看从( 开始的日志,这表明它是一个数组。

你也可以这样检查,

    if ([DATA isKindOfClass:[NSDictionary class]]) 
      //then this is dictionary
    else
        // other datatype
    

在用作NSLog(@"%@",[DATA objectForKey:@"deadline"]) 之前。

如果你现在想访问,你可以使用 as,但是这个 DATA 应该是 NSArray or NSMutableArray

@property (strong, nonatomic) NSArray *DATA;

[[DATA objectAtIndex:0] objectForKey:@"deadline"]

【讨论】:

【参考方案2】:

上面的 JSON 响应是一个数组而不是字典,() = 数组和 = 字典。

理想情况下,你应该有类似的东西,

  
   "comment":"",
   "deadline":"deadline",
   "id":2,
   "responsible":"responsable action 1",
   "status":"pending",
   "title":""

不过,您可以尝试使用数组而不是字典,并检查它在解析时是否会出错。

【讨论】:

以上是关于目标c [__NSArrayM objectForKey:]:发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

NSArrayM 在枚举时发生了突变

如何提取 __NSArrayM 中的每个元素?

无法将“__NSArrayM”类型的值转换为“NSDictionary”

集合 <__NSArrayM: 0x7fa1f2711910> 在枚举时发生了突变

在映射集合时快速获取异常“所需类型 = NSOrderedSet;给定类型 = __NSArrayM”

[__NSArrayM objectAtIndex:]: 索引 9223372036854775807 超出范围 [0 .. 13]'