obj-c中的集合引用

时间:2011-12-07 20:03:06

标签: objective-c ios4

我是Obj-C的新手,我在这里遇到了一些问题。

我正在尝试将临时字典中的值插入数组

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init];
NSMutableArray *myArray = [[NSMutableArray alloc] init];

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"];
[myDict setObject:@"www" forKey:@"Name"];
[myArray addObject:myDict];

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"];
[myDict setObject:@"eee" forKey:@"Name"];
[myArray addObject:myDict];

[myDict setObject:[NSNumber numberWithInt:70] forKey:@"Record"];
[myDict setObject:@"rrr" forKey:@"Name"];
[myArray addObject:myDict];

[myDict setObject:[NSNumber numberWithInt:0] forKey:@"Record"];
[myDict setObject:@"ttt" forKey:@"Name"];
[myArray addObject:myDict];

NSLog(@"myArray %@",myArray);

无论这里的实施代码不好(以及我的英语不好:p),我想弄清楚的是如何在myDict每次插入后清除myArray。< / p>

在每个[myDict removeAllObjects];之后使用addObject在最后给我一个空数组。

谢谢!

感谢您的所有答案,[myArray addObject:[[myDict copy] autorelease]];代码运行正常。

3 个答案:

答案 0 :(得分:4)

这里的问题是你一遍又一遍地将完全相同的可变字典添加到数组中。因此,您的数组只是对完全相同对象的引用的集合。因此,数组中的每个对象与最后一个对象相同都应该不足为奇。

为了做你想做的事,你有两个选择。第一种是每次都复制你的可变字典并将该副本添加到数组中。您可以使用

执行此操作
[myArray addObject:[[myDict copy] autorelease]];

另一个解决方案是使用单独的词典开头。您不必每次都改变一个可变字典,而是构建一个全新的NSDictionary:

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithInt:100], @"Record",
                    @"www", @"Name",
                    nil]];

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithInt:80], @"Record",
                    @"eee", @"Name",
                    nil]];

答案 1 :(得分:2)

我认为在将字典添加到数组之前需要复制字典...

[myArray addObject:[[myDict copy] autorelease]];

然后您可以照常使用[myDict removeAllObjects]

答案 2 :(得分:0)

NSMutableDictionary *因为*建议是指向字典对象的指针。 因此,当您将其添加到数组时,它仍然是同一个对象 - 由myDict指向以及数组中的元素。 因此,我建议您在每次添加后创建新词典:

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init];
NSMutableArray *myArray = [[NSMutableArray alloc] init];

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"];
[myDict setObject:@"www" forKey:@"Name"];
[myArray addObject:myDict];

myDict = [[NSMutableDictionary alloc] init];

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"];
[myDict setObject:@"eee" forKey:@"Name"];
[myArray addObject:myDict];

我假设您在上面的代码中使用ARC。

尽管如此,Objective-C'方式将会更多:

    [myArray addObject: [NSDictionary dictionaryForObjectsAndKeys: [NSNumber numberWithInt:80], @"Record", @"www", @"Name"]];