setObjectForKey:mutableArray 中的对象不能为 nil
setObjectForKey: object cannot be nil in mutableArray
您好。我有如下代码,我想向字典中的同一个键添加多个值。
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
在其中添加元素。请问这是为什么?
写的时候
NSMutableArray *objectArray = [[NSMutableArray alloc] init];
您正在该 'else' 语句内部创建一个本地新变量。因此,它被创建然后立即被释放,因为在 else 语句中它后面没有任何内容。
您想更新变量而不是重新创建它 - 尝试用
替换流氓行
objectArray = [[NSMutableArray alloc] init];
(当我们不指定类型时,例如 'NSMutableArray *',我们分配给一个现有变量,而不是建立一个新变量。)
这是因为您有两个 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 的 else 子句中错误地重新定义了对象数组。如果 object 不是 NSMutableArray,你会得到 else 初始化新的 ObjectArray 而不是在你的 if 语句顶部定义的那个。
您好。我有如下代码,我想向字典中的同一个键添加多个值。
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
在其中添加元素。请问这是为什么?
写的时候
NSMutableArray *objectArray = [[NSMutableArray alloc] init];
您正在该 'else' 语句内部创建一个本地新变量。因此,它被创建然后立即被释放,因为在 else 语句中它后面没有任何内容。
您想更新变量而不是重新创建它 - 尝试用
替换流氓行objectArray = [[NSMutableArray alloc] init];
(当我们不指定类型时,例如 'NSMutableArray *',我们分配给一个现有变量,而不是建立一个新变量。)
这是因为您有两个 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 的 else 子句中错误地重新定义了对象数组。如果 object 不是 NSMutableArray,你会得到 else 初始化新的 ObjectArray 而不是在你的 if 语句顶部定义的那个。