iOS10 中的 isKindOfClass 面临的问题
Issue facing in isKindOfClass in iOS10
最近我升级了 XCode8 我在 isKindOfClass
方法中遇到问题,此代码一直工作到 iOS9
但在 iOS10
突然 [items isKindOfClass: [NSMutableArray class]]
编译器不进入 for 循环条件 我可以知道是什么原因吗?
NSMutableArray
是 NSArray
的 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
,因此您可能需要它们的可变副本。
当然,如果您不改变数组或字典,那么无论您拥有可变对象还是不可变对象,您都可以只使用 NSArray
和 NSDictionary
。
最近我升级了 XCode8 我在 isKindOfClass
方法中遇到问题,此代码一直工作到 iOS9
但在 iOS10
突然 [items isKindOfClass: [NSMutableArray class]]
编译器不进入 for 循环条件 我可以知道是什么原因吗?
NSMutableArray
是 NSArray
的 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
,因此您可能需要它们的可变副本。
当然,如果您不改变数组或字典,那么无论您拥有可变对象还是不可变对象,您都可以只使用 NSArray
和 NSDictionary
。