0

我正在尝试在循环内为我的 NSMutableDictionary 设置一些值,并每次将字典值分配给 NSMutableArray ,如下所示,

for(int i=0;i<=lastObj;i++){
[mutableDict setValue:[valuesArray objectAtIndex:i] forKey:@"Name"];
[mutableDict setValue:[uniqueArray objectAtIndex:i] forKey:@"SSN"];
//......then
**[mutableArray addObject:mutableDict];**/*not working perfectly all values s replaced by final mutableDict values (duplicate values)*/

**[mutableArray addObject:[mutableDict copy]];**/* Working Correctly !!! */
}

每次迭代中的循环内部都会将新值分配给 mutableDictionary 并且每当我说 addObject 我的 mutableArray 正在获取所有重复值但每当我说 addObject:[mutableDict copy ] 时,数组正在获取正确的唯一值而没有任何重复,我不知道当我说复制时编译器有什么不同,有人能告诉我这有什么不同吗?提前致谢。

4

2 回答 2

4
[mutableArray addObject:mutableDict];

继续将 mutableDict 添加到 mutableArray。添加对象不会创建新的内存位置,它指向相同的内存。因此,当您设置 mutableDict 的值时,它会反映在所有添加的对象中,因为它们引用相同的内存位置。

复制创建一个新的内存位置并添加删除上述场景的对象。

为避免这种情况,您可以添加

for(int i=0;i<=lastObj;i++){
NSMutableDictionary * mutableDict = [NSMutableDictionary new]; //create new memory location
[mutableDict setValue:[valuesArray objectAtIndex:i] forKey:@"Name"];
[mutableDict setValue:[uniqueArray objectAtIndex:i] forKey:@"SSN"];

[mutableArray addObject:mutableDict];
[mutableDict release]; //release 
}

希望这对你有帮助。快乐编码:)

于 2012-05-10T10:47:07.993 回答
1

查看您的代码块,很明显您在 for 循环之外分配 mutableDict 。因此,当您在 for 循环中说下面的语句时,基本上您将相同的对象传递给 mutalbeArray。

[mutableArray addObject:mutableDict];

addObject 不为对象分配任何内存,但它使用传递的相同对象并仅发送“保留”消息以增加引用计数。由于您在 for 循环中传递相同的对象,因此 mutalbeArray 将包含对相同对象的引用。

在复制的情况下,

[mutableArray addObject:[mutableDict 副本]];

发送到 mutableDict 的复制消息返回一个新副本,然后将其传递给 addObject。因此,forloop 中的每次迭代都会将一个新对象(由于复制)传递给 addObject。

还要注意以下这些

  1. Copy 创建一个新对象,它应该稍后发布,但您的代码没有发布它。这将导致内存泄漏。
  2. Copy 创建不可变对象,因此如果您希望修改添加到 mutableArray 的对象,则应该使用 mutableCopy 代替。
于 2012-05-10T11:56:40.917 回答