setObject:forKey:在多暗的NSMuteableDictionary上使用时崩溃

时间:2016-05-10 22:34:52

标签: ios objective-c nsmutabledictionary

我有一个NSMutableDictionary,里面我有一系列的部分元素。我需要在子部分中更改其中一个元素。

所以我从返回的对象中创建一个NSMutableDictionary,我想修改它,然后在主NSMutableDictionary中替换它。

        int intTagToFind = 1;
        NSLog(@"Finding tag %u",intTagToFind);
        for (int i=0; i < returnDict.count; i++){
            NSString *keyString = [NSString stringWithFormat: @"section%03d",i];
            NSMutableDictionary *sectionData = [returnDict objectForKey:keyString];
            for (int j=0; j<sectionData.count; j++) {
                int myTag = [[sectionData objectForKey:@"tag"] intValue];
                if (myTag == intTagToFind){
                    NSLog(@"Found Tag: %u %u",myTag,intTagToFind);
                    NSLog(@"Key to finding is %@",keyString);
                    NSLog(@"Header is:%@",[sectionData objectForKey:@"section header"]);
                    NSLog(@"Class: %@",[sectionData class]);
                    NSLog(@"Class: %@",[returnDict class]);


[sectionData setObject:@"new header here" forKey:@"section header"];
                    NSLog(@"New Header is:%@",[sectionData objectForKey:@"section header"]);

                }
            }
        }

它给出:[_ _ NSDictionaryI setObject:forKey:]:无法识别的选择器发送到实例0x7f9414110080

当我创建sectionData时:NSMutableDictionary * sectionData = [returnDict objectForKey:keyString];

它将类名返回为__NSDictionaryI,而returnDict是类名:__ NSDictionaryM

为什么它给我错误的类型?你能不能从objectForKey获得一个可静音的字典?

以下是将数组转换为字典的代码:

NSMutableDictionary *returnDict = [[NSMutableDictionary alloc] init];
for(int i=0; i < [returnData count] - 1; i++)
{
    [returnDict setObject:[returnData objectAtIndex:i+1] forKey:[NSString stringWithFormat: @"section%03d", i]];
}

以下是数组的样本:

NSArray *returnData = @[ @{ @"section header": @"Business News",
                                        @"sub header": @"Investing news",
                                        @"sub header scroll": @"0",
                                        @"sub button": @"Delete",
                                        @"tag":@"0",
                                        @"articles": @[ @{ @"title": @"One" },
                                                        @{ @"title": @"Longer" },
                                                        @{ @"title": @"Even Longer" },
                                                        @{ @"title": @"Still Much Longer" },
                                                        @{ @"title": @"Really Long Title Here Now." }
                                                        ]
                                        },

我使用'tag'作为唯一ID。

我创建数组,将数组加载到字典中,然后想要更改内部的元素,如标题,按钮等...使用标记作为唯一ID。

1 个答案:

答案 0 :(得分:1)

此代码:

NSMutableDictionary *sectionData = [returnDict objectForKey:keyString];

不创建可变字典。它在key keyString中获取returnDict中的任何内容,并将其CASTS引入NSMutableDictionary类型。基础对象不会改变。

此时,您实际上已经从returnDict共享了该对象的所有权。如果对象在returnDict内是不可变的,它将保持不变。

你可能想这样做:

NSDictionary *immutableSectionData = [returnDict objectForKey:keyString];
NSMutableDictionary *sectionData = [immutableSectionData mutableCopy];

(上面的代码分为两行,只是为了便于在狭窄的SO文本视图中阅读。)

编辑:

事实上,如果帖子中的第二个代码块是您创建数据结构的方式,那么整个事情就是不可变的。你无法改变任何一个。