iOS10 中的 isKindOfClass 面临的问题

Issue facing in isKindOfClass in iOS10

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

NSMutableArrayNSArray 的 child class 所以当我更改为 [NSArray class] 然后它工作正常所以我很困惑为什么这个改变会影响NSMutableArray class 是 NSArray 的 child class?

     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
         }
     }

从您的评论看来,您实际上有一个 NSArray,而不是 NSMutableArray,因此 isKindOfClass 工作正常。除非您另有说明,否则 AFN 将提供不可变容器,这在 iOS 10 上应该没有任何不同,所以我不确定为什么它以前可以工作。

与测试可变数组相比,创建其中任何内容的可变副本可能更简单,这样您就不必尝试优雅地处理 "failure" 条件:

NSArray *items = [jsonDictionary objectForKey:@"items"];
if (items != nil) {
     NSMutableArray *mutableItems = [items mutableCopy];
     for (NSMutableDictionary *item in mutableItems)
     {
       // Rest of Code
     }
 }

注意,除非您已指定 AFN 选项以提供可变容器,否则 items 数组中的字典将是 NSDictionary 而不是 NSMutableDictionary,因此您可能需要它们的可变副本。

当然,如果您不改变数组或字典,那么无论您拥有可变对象还是不可变对象,您都可以只使用 NSArrayNSDictionary