【问题标题】:Issue facing in isKindOfClass in iOS10iOS10 中 isKindOfClass 面临的问题
【发布时间】:2016-09-16 04:13:51
【问题描述】:

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

NSMutableArrayNSArray 的子类,所以当我更改为[NSArray class] 时它工作正常,所以我很困惑为什么这个更改会影响NSMutableArray 类,它是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
         }
     }

【问题讨论】:

  • 你是如何解析 JSON 的?您是否正在为可变容器设置选项?您是否设置了断点并使用调试器检查,items 实际上是什么?所有证据都表明它是NSArray 而不是NSMutableArray
  • @Paulw11 Yesi 已经检查了我用调试器检查过的所有项目有一个项目,并且这第一个代码块一直工作到 iOS9,当我将 NSMutableArray 更改为 NSArray 时我已经用调试器检查过它会工作正常,这只发生在 iOS10
  • 那么,调试器中显示的items 的类是什么?
  • 它将显示NSArray 类,但 NSMutableArray 是 NSArray 的子类,那么为什么它不起作用
  • 所以,这就是你的答案。它是一个 NSArray。问题不在于isKindOfClass,而在于您创建对象的方式。如果您想要可变容器,可以将一个选项传递给NSJSONSerializer。默认情况下,您会获得不可变的容器。

标签: ios objective-c nsmutablearray nsarray ios10


【解决方案1】:

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

与测试可变数组相比,创建一个可变副本可能更简单,这样您就不必尝试优雅地处理“失败”条件:

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,无论您有可变对象还是不可变对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多