问候语。我有类似下面的代码,我想为字典中的相同键添加多个值。
if ([_sectionContents objectForKey:AddKey] != nil) {
//Already exist a value for the key
id object = [_sectionContents objectForKey:AddKey];
NSMutableArray *objectArray;
if ([object isKindOfClass:[NSMutableArray class]]) {
objectArray = (NSMutableArray *)object;
} else {
NSMutableArray *objectArray = [[NSMutableArray alloc] init];
}
[objectArray addObject:course];
[_sectionContents setObject:objectArray forKey:AddKey];
} else {
//No value for the key
[_sectionContents setObject:[NSArray arrayWithObjects:course,nil] forKey:AddKey];
}
然而,我收到了错误
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil
我发现这是因为行
[_sectionContents setObject:objectArray forKey:AddKey];
此外,我收到了objectArray
未使用的警告
我不理解它,因为我确实使用objectArray
来添加元素。为什么这样?
答案 0 :(得分:3)
写作时
NSMutableArray *objectArray = [[NSMutableArray alloc] init];
你要在'else'语句的内部创建一个新的变量。因此,它会被创建然后立即释放,因为在else语句中没有任何内容。
您想要更新变量而不是重新创建它 - 尝试用
替换流氓行objectArray = [[NSMutableArray alloc] init];
(当我们没有指定类型,例如'NSMutableArray *'时,我们分配给现有变量,而不是建立一个新变量。)
答案 1 :(得分:1)
这是因为你有两个objectArray而不是一个
if ([_sectionContents objectForKey:AddKey] != nil) {
...
// first one
NSMutableArray *objectArray;
if ([object isKindOfClass:[NSMutableArray class]]) {
objectArray = (NSMutableArray *)object;
} else {
// second one (*)
NSMutableArray *objectArray = [[NSMutableArray alloc] init];
// *** Correct Solution ***
objectArray = [[NSMutableArray alloc] init];
}
...
} else {
...
}
(*)您已在主if ([_sectionContents objectForKey:AddKey] != nil) {
内的if子句中错误地重新定义了对象数组。如果对象不是NSMutableArray那么你会得到初始化新ObjectArray的else而不是if语句顶部定义的那个。