"Release>nil>init" 更新 NSMutableDictionary 的可接受方法?



下面的方法是一个可接受的(即最佳实践,非黑客)更新NSMutableDictionary的方式吗?

基本上,我希望该方法检查字典是否已经初始化/填充。如果它没有,那么我希望它继续使用我拥有的一组特定的ivar来填充它,并使用匹配的键集。

如果它已经被初始化/填充,我想要刷新,我想避免必须为字典中的每个元素写出setObject:forKey:

所以…

  1. "释放">"设置nil">"重新初始化"是一个可接受的方法来刷新这个字典吗?
  2. 如果是这样,除非我想重复setObject:forKey:
  3. 一行又一行,否则对于大值的字典,是否只有方法可以做到这一点?

谢谢!代码:

- (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
  • 此外,我直接为releasenil访问了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];
    }
}

相关内容

最新更新