我有以下代码:
- (id)initWithDictionaryRepresentation:(NSDictionary *)dictionary {
self = [super init];
if (self != nil) {
dictionaryRepresentation = [dictionary retain];
NSArray *allKeys = [dictionaryRepresentation allKeys];
NSDictionary *k = [dictionaryRepresentation objectForKey:[allKeys objectAtIndex:[allKeys count] - 1]];
NSArray *stepDics = [k objectForKey:@"Steps"];
numerOfSteps = [stepDics count];
steps = [[NSMutableArray alloc] initWithCapacity:numerOfSteps];
for (NSDictionary *stepDic in stepDics) {
[(NSMutableArray *)steps addObject:[UICGStep stepWithDictionaryRepresentation:stepDic]];
}
............
}
我的应用程序在此行崩溃:
NSArray *stepDics = [k objectForKey:@"Steps"];
但如果我试试这个也会崩溃:NSArray *stepDics = [k objectForKey:@"pr"];
。似乎我无法访问任何密钥!
这就是我的字典的样子: http://pastebin.com/w5HSLvvT
有什么想法吗?
答案 0 :(得分:1)
NSArray *allKeys = [dictionaryRepresentation allKeys];
将以不可预测的顺序返回密钥,因此您不应该使用
id key = [allKeys objectAtIndex:[allKeys count] - 1]
因为它可能每次都返回不同的内容,这在NSDictionary Documentation中的此函数的文档中显示。
未定义数组中元素的顺序
为什么不试试
NSDictionary* a = [dictionary objectForKey:@"A"];
NSArray* stepDics = [a objectForKey:@"Steps"];
答案 1 :(得分:0)
如果您要求输入不存在的密钥,字典将返回nil
。它崩溃的事实意味着您有内存管理错误,而不是您在上面显示的代码中,而是在创建传递到initWithDictionaryRepresentation:
方法的字典的代码中。你过度释放了存储在字典的@"Steps"
键中的数组。