在使用 解析来自 web 服务的 JSON 响应后NSJSONSerialization
,我使用+isKindOfClass:
来确保服务器返回我期望的数据类型。使用这种方法,我遇到了一些奇怪的行为,我将用一个例子来说明。
考虑以下对象:
// Definitions
NSDictionary *son = @{ @"firstname" : @"James", @"lastname" : @"Appleseed" };
NSDictionary *daughter = @{ @"firstname" : @"Susan", @"lastname" : @"Appleseed"};
NSArray *children = @[son, daughter];
NSDictionary *father = @{ @"firstname" : @"John", @"lastname" : @"Appleseed" };
NSDictionary *family = @{@"children" : children, @"father" : father};
NSDictionary *pedigree = @{@"family" : family };
这些对象代表从服务器返回的反序列化 JSON。现在,如果我想使用孩子的数组来计算使用 NSArray 的孩子有多少-count
,我需要确保孩子对象是一个 NSArray。例如,如果子对象恰好是一个字符串,而应用程序需要一个数组,它会崩溃,因为字符串没有实现count
方法。考虑以下实现所述检查的代码序列:
// First test
id _family = [pedigree objectForKey:@"family"];
if ([_family isKindOfClass:[NSDictionary class]])
{
NSDictionary *_family = (NSDictionary *)_family;
id _children = [_family objectForKey:@"children"];
NSLog(@"Children: %@", _children);
NSLog(@"Children classname: %@", NSStringFromClass(children.class));
if ([_children isKindOfClass:[NSArray class]]) {
NSLog(@"Children is an NSArray");
} else {
NSLog(@"Children is not an NSArray");
}
} else {
NSLog(@"Family is not an NSDictionary");
}
运行此代码后,控制台输出以下内容:
Children: (null)
Children classname: __NSArrayI
Children is not an NSArray
控制台输出看起来非常显着,甚至自相矛盾。当其类名是 __NSArrayI 时,children 怎么可能不是NSArray?
经过一番调试,我发现有两种方法可以解决这个问题:
- 删除此行
NSDictionary *_family = (NSDictionary *)_family;
_family
使用与转换变量不同的名称
如何解释这种行为?