“发布> nil> init”更新NSMutableDictionary的可接受方式?

时间:2011-07-26 23:41:04

标签: iphone ios memory-management nsmutabledictionary

下面的方法是否可以更新NSMutableDictionary(

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

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

因此...

  1. “Release”>“Set nil”>“Re-init”是一种可以接受的刷新字典的方法吗?
  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,因此假设object1object2等实际上是self.object1self.object2 ...
    • 另外,我直接访问了fetchDataDict iVar releasenil,因为我认为这是我们应该做的,但如果我错了,请纠正我。

    这个问题以学习为中心,欢迎长时间的解释!

1 个答案:

答案 0 :(得分:1)

由于您正在使用属性访问器,并且我假设您将属性标记为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];
    }

}