iPhone ...如果您有一个NSMrray的NSMutableDictionaries,那么Array是否会对dict或“副本”进行引用?

时间:2010-06-24 21:51:08

标签: iphone nsarray nsdictionary nsmutabledictionary

好吧,来自perl背景,我习惯于将数据保存为Hashes(iPhone中的字典)。

我想知道的是:如果我有一个NSMrray的NSMutableDictionaries。假设我将以下NSMutableDictionary添加到NSArray:

[theArray addObject:[[NSMutableDictionary alloc] initWithObjectsAndKeys: timestamp, @"timestamp" ,name, @"name" ,lat, @"lat" ,lon, @"lon" , nil]];

然后我像这样循环遍历数组:

for (NSMutableDictionary theDict in theArray)
{

}

每个theDict代表一个指针NSMutableDictionary的数据,以便我可以这样做:

for (NSMutableDictionary *theDict in theArray)
{
      if ([theDict objectForKey:@"timestamp"] != nil && [[theDict objectForKey:@"timestamp"] isEqualToString:@"timestamp"])
      {
           [theDict setObject:@"new name" forKey@"name"];
      }   
}

然后期望theArray在theArray的整个生命周期中保持更改的值?

或者,我是否需要这样做:

int ct = 0;
for (NSMutableDictionary *theDict in theArray)
{
      if ([theDict objectForKey:@"name"] != nil && [[theDict objectForKey:@"name"] isEqualToString:@"name you want to change"])
      {
           NSMutableDictionary *tmpDict = [[NSMutableDictionary alloc] initWithDictionary:theDict copyItems:YES];
           [tmpDict setObject:@"new name" forKey@"name"];
           [theDict replaceObjectAtIndex:ct withObject:tmpDict];
           [tmpDict release];
           break;
      }
      ct += 1;
}

它可能不是所有代码,可以吗? - 只是为NSArray中保存的NSMutableDictionary的键替换一个值?

很抱歉,如果这个问题对某些人来说是显而易见的......但仍然试图将我的思想包围在Objective-c中的字典(或对象)指针 - 大致相当于perl中的散列的引用 - vs Objective-c中对象的副本(或深度复制)。并且NSArray将指针(希望)保存到NSMutableDictionaries使问题变得更加混乱。这是在perl中完成的 - 以及我所理解的 - 在名称之外(指针与引用)..它在Objective-c中是相同的。

1 个答案:

答案 0 :(得分:1)

你应该以第一种方式做到这一点。每个theDict都是指向原始内容的指针,而不是副本。

编辑:在编辑问题后,其余的答案不再相关,但留下来给评论提供上下文,因为您永远不会有太多指向对象所有权文档的链接!


你的autorelease vs release旁边暗示可能存在对其他事情的误解,但这可能不是详细讨论的时候。我建议您再看一下object ownership docs,以确保您了解autorelease的真正含义。

(顺便说一句,你的初始tmpArray应该是theArray我认为,除非我完全误解了你的问题。循环变量的类型应该是NSMutableDictionary*而不是{{ 1}}。)