所以我有一组NSDictionaries,每个NSDictionary都有一堆与照片方面相关的键/值对(来自Flickr)。
我正在创建一个具有UITableViewController的应用,其单元格应该是每个不同类别的照片。所以在伪代码中,我正在尝试构建一个新的NSDictionary(键是照片的类别,值是包含该键的照片的NSDictionaries)。我正在遍历初始数组中的每个NSDictionary,获取类别标记,并说,如果我的新NSDict不包含此键,则为空数组创建一个新键。然后将当前NSDict添加到该数组。我得到了一致的错误,不知道为什么。
这是稀释代码。
photoList = [FlickrFetcher photosWithTags:[NSArray arrayWithObjects: @"CS193p_SPoT", nil]];
NSLog(@"%@", photoList);
categories = [[NSDictionary alloc] init];
NSArray *temp = [[NSArray alloc] init];
for (id obj in photoList) {
temp = [[obj objectForKey:@"tags"] componentsSeparatedByString:@" "];
for (id string in temp) {
if (![categories objectForKey:string]) {
NSMutableArray *arr = [[NSMutableArray alloc] init];
[categories setObject:arr forKey:string];
//[arr release];
}
NSMutableArray *photos = [categories objectForKey:string];
[photos addObject:obj];
[categories setObject:photos forKey:string];
}
}
谢谢!
答案 0 :(得分:4)
NSDictionary
没有方法setObject:forKey:
。您需要NSMutableDictionary
。
self.categories = [NSMutableDictionary dictionary];
除此之外,请使用Joost优秀的代码重写。
SIGABRT,你知道,很可能意味着某个断言失败了。在这种情况下,它可能是CoreFoundation *中的一个断言;当您尝试访问类似的字典时,CF会检查是否存在可变性,如果对象不可变则会导致中断。
*我最近刚刚了解了CF source's availability并且一直在研究它,所以这可能只是“新事物”偏见和错误。
答案 1 :(得分:1)
我没有注意到代码中的任何错误(语法错误),但是这里有一段更新的代码,它实现得更清晰(没有内存泄漏)
self.photoList = [FlickrFetcher photosWithTags:[NSArray arrayWithObjects: @"CS193p_SPoT", nil]];
NSLog(@"%@", photoList);
self.categories = [NSDictionary dictionary];
for (NSDictionary *obj in photoList) {
NSArray *temp = [[obj objectForKey:@"tags"] componentsSeparatedByString:@" "];
for (NSString *string in temp) {
NSMutableArray *photos = [categories objectForKey:string];
if (!photos) {
photos = [NSMutableArray array];
[categories setObject:photos forKey:string];
}
[photos addObject:obj];
}
}
如果它不起作用,请告诉我们确切的警告,是否是由此造成的。