iOS10中的isKindOfClass面临的问题

时间:2016-09-16 04:13:51

标签: ios objective-c nsmutablearray nsarray ios10

最近我升级了 XCode8 我在isKindOfClass方法中遇到问题此代码一直工作到iOS9,但在iOS10突然[items isKindOfClass: [NSMutableArray class]]编译器不进入for循环条件我可能知道是什么原因?

NSMutableArrayNSArray的子类,所以当我更改为[NSArray class]时,它会正常工作,所以我很困惑为什么这个更改会影响到NSMutableArray这个类是{child} NSArray的等级?

     NSMutableArray *items = [jsonDictionary objectForKey:@"items"]; // Here i am taking response in NSMutableArray

     if ([items isKindOfClass: [NSMutableArray class]] && items != nil) // not working  {
         for (NSMutableDictionary *item in items)
         {
           // Rest of Code
         }
     }

这段代码对我有用我混淆上面的代码工作直到iOS9当我更改下面的代码然后在iOS10工作之后:

     NSMutableArray *items = [jsonDictionary objectForKey:@"items"];

     if ([items isKindOfClass: [NSArray class]] && items != nil) // Changed to NSArray  {
         for (NSMutableDictionary *item in items)
         {
           // Rest of Code
         }
     }

1 个答案:

答案 0 :(得分:2)

根据您的评论,您似乎确实拥有NSMutableArray,而不是isKindOfClass,因此NSArray *items = [jsonDictionary objectForKey:@"items"]; if (items != nil) { NSMutableArray *mutableItems = [items mutableCopy]; for (NSMutableDictionary *item in mutableItems) { // Rest of Code } } 正常运作。 AFN将提供不可变容器,除非你另有说明,这在iOS 10上不应该有任何不同,所以我不确定它为什么以前工作。

不是测试一个可变数组,而是创建一个可变副本可能更简单,这样你就不必尝试处理"失败"条件优雅:

items

请注意,除非您已指定AFN提供可变容器的选项,否则NSDictionary数组中的词典将为NSMutableDictionary而非NSArray,因此您可能需要制作可变副本他们。

当然,如果你没有改变数组或字典,那么无论你是否有一个可变或不可变的对象,你都可以只是NSDictionary和{{1}}。