下面的方法是一个可接受的(即最佳实践,非黑客)更新NSMutableDictionary的方式吗?
基本上,我希望该方法检查字典是否已经初始化/填充。如果它没有,那么我希望它继续使用我拥有的一组特定的ivar来填充它,并使用匹配的键集。
如果它已经被初始化/填充,我想要刷新,我想避免必须为字典中的每个元素写出setObject:forKey:
。
所以…
- "释放">"设置nil">"重新初始化"是一个可接受的方法来刷新这个字典吗?
- 如果是这样,除非我想重复
setObject:forKey:
一行又一行,否则对于大值的字典,是否只有方法可以做到这一点?
谢谢!代码:
- (void) populateFetchDataDict {
if (!self.fetchDataDict) {
self.fetchDataDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
} else {
[fetchDataDict release];
fetchDataDict = nil;
self.fetchDataDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
}
}
次要注意事项:
-
fetchDataDict
是一个iVar,所有的对象都是,所以假设object1
,object2
等实际上是self.object1
,self.object2
… - 此外,我直接为
release
和nil
访问了fetchDataDict
iVar,因为我认为这就是我们应该做的,但如果我错了,请纠正我。
这个问题是以学习为重点的,所以欢迎长时间的解释!
由于您正在使用属性访问器,并且我假设您将属性标记为retain
,因此您可以简单地设置新值—旧值将自动释放。事实上,你的代码现在没有崩溃的唯一原因是你保留了过多的新字典,没有自动释放它们,而你应该这样做。
实际上你的代码可以简单地看起来像:
- (void) populateFetchDataDict {
self.fetchDataDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
}
如果您只想在现有的字典中设置这些特定的值,那么您可以在If语句中添加,并将这些默认值与现有的字典合并:
- (void) populateFetchDataDict {
NSDictionary *defaultDict = [NSMutableDictionary dictonaryWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
if (!self.fetchDataDict) {
self.fetchDataDict = defaultDict;
} else {
[self.fetchDataDict addEntriesFromDictionary:defaultDict];
}
}