好吧,来自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中是相同的。
答案 0 :(得分:1)
你应该以第一种方式做到这一点。每个theDict
都是指向原始内容的指针,而不是副本。
编辑:在编辑问题后,其余的答案不再相关,但留下来给评论提供上下文,因为您永远不会有太多指向对象所有权文档的链接!
你的autorelease vs release
旁边暗示可能存在对其他事情的误解,但这可能不是详细讨论的时候。我建议您再看一下object ownership docs,以确保您了解autorelease
的真正含义。
(顺便说一句,你的初始tmpArray
应该是theArray
我认为,除非我完全误解了你的问题。循环变量的类型应该是NSMutableDictionary*
而不是{{ 1}}。)