1

好的,来自 perl 背景,我习惯于 Arrays 将 refs 保存到 Hashes(iPhone 用语中的字典)。

我想知道的是:如果我有一个 NSMutableDictionaries 的 NSArray。假设我将以下 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 中哈希的引用——与副本Objective-c 中对象的(或深拷贝)。NSArray 持有指向 NSMutableDictionaries 的指针(希望如此)使问题变得更加混乱。这就是它在 perl 中的完成方式——据我所知——在名称之外(指针与引用).. 在 Objective-c 中也是如此。

4

1 回答 1

1

你应该用第一种方法。每个theDict都是指向原始文件的指针,而不是副本。

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


你的autorelease vs release旁白暗示了对其他事情的可能误解,但这也许不是详细讨论的时候。我建议您再看一下对象所有权文档,以确保您了解autorelease真正的含义。

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

于 2010-06-24T22:03:24.463 回答