setObjectForKey:对象在mutableArray中不能为nil

时间:2015-04-10 19:05:30

标签: objective-c nsmutablearray

问候语。我有类似下面的代码,我想为字典中的相同键添加多个值。

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来添加元素。为什么这样?

2 个答案:

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