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 语句顶部定义的那个。