【发布时间】:2016-09-16 04:13:51
【问题描述】:
最近我升级了 XCode8 我在 isKindOfClass 方法中遇到问题,此代码一直工作到 iOS9 但在 iOS10 突然 [items isKindOfClass: [NSMutableArray class]] 编译器不进入 for 循环条件可能我知道是什么原因?
NSMutableArray 是NSArray 的子类,所以当我更改为[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