setObject: forKey: 在 multi-dim NSMuteableDictionary 上使用时崩溃
setObject: forKey: crashes when used on multi-dim NSMuteableDictionary
我有一个 NSMutableDictionary,里面有一系列的部分元素。我需要更改子部分中的其中一个元素。
所以我从返回的 object 中创建了一个 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];
它返回 class name 作为 __NSDictionaryI 而 returnDict 是 class name: __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。
我创建数组,将数组加载到字典中,然后想更改其中的元素,如 header、按钮等...使用标签作为唯一 ID。
此代码:
NSMutableDictionary *sectionData = [returnDict objectForKey:keyString];
不创建可变字典。它在键 keyString 处获取 returnDict 中的任何内容,并将其转换为 NSMutableDictionary 类型。底层对象没有改变。
此时您实际上已从 returnDict 共享对象的所有权。如果对象在 returnDict
中是不可变的,它将保持不可变。
您可能想要这样做:
NSDictionary *immutableSectionData = [returnDict objectForKey:keyString];
NSMutableDictionary *sectionData = [immutableSectionData mutableCopy];
(上面的代码被分成两行只是为了在狭窄的 SO 文本视图中易于阅读。)
编辑:
事实上,如果 post 中的第二个代码块是您创建数据结构的方式,那么整个事情都是不可变的。您将无法更改任何内容。
我有一个 NSMutableDictionary,里面有一系列的部分元素。我需要更改子部分中的其中一个元素。
所以我从返回的 object 中创建了一个 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];
它返回 class name 作为 __NSDictionaryI 而 returnDict 是 class name: __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。
我创建数组,将数组加载到字典中,然后想更改其中的元素,如 header、按钮等...使用标签作为唯一 ID。
此代码:
NSMutableDictionary *sectionData = [returnDict objectForKey:keyString];
不创建可变字典。它在键 keyString 处获取 returnDict 中的任何内容,并将其转换为 NSMutableDictionary 类型。底层对象没有改变。
此时您实际上已从 returnDict 共享对象的所有权。如果对象在 returnDict
中是不可变的,它将保持不可变。
您可能想要这样做:
NSDictionary *immutableSectionData = [returnDict objectForKey:keyString];
NSMutableDictionary *sectionData = [immutableSectionData mutableCopy];
(上面的代码被分成两行只是为了在狭窄的 SO 文本视图中易于阅读。)
编辑:
事实上,如果 post 中的第二个代码块是您创建数据结构的方式,那么整个事情都是不可变的。您将无法更改任何内容。