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