将NSMutableArray A添加到NSMutableArray B,然后在A上执行“removeAllObjects”,也清除B?

时间:2011-05-17 11:15:34

标签: objective-c nsmutablearray

A = bookmarkArray
B = issueArray              
[issueArray addObject:bookmarkArray];
[bookmarkArray removeAllObjects];

为什么这会使issueArray变空,我该怎么做以确保在清除bookmarkArray时仍然填充了issueArray?

4 个答案:

答案 0 :(得分:4)

因为当你调用addObject时,它会添加引用,而不是对象的副本。因此,原始对象中的任何更改都将反映在存储在数组中的引用中。如果要存储对象的副本,则将其复制并存储在数组中。

NSMutableArray *bookmarkCopy = [bookmarkArray mutableCopy];
[issueArray addObject:bookmarkCopy];
[bookmarkCopy release];

答案 1 :(得分:3)

您可以将bookmarkArray直接添加到issueArray。那么,issueArray就是一个包含单个对象的数组,也就是数组bookmarkArray。如果你改变bookmarkArray,那么你会改变issueArray中的东西。

如果你想将bookmarkArray中当前的所有对象添加到issueArray,那么我建议:

[issueArray addObjectsFromArray:bookmarkArray];

如果你想获取bookmarkArray的副本并将其添加到issueArray,那么我建议taskinoor已经提出了完全相同的建议:

NSMutableArray *bookmarkCopy = [bookmarkArray mutableCopy];
[issueArray addObject:bookmarkCopy];
[bookmarkCopy release];

或者:

NSMutableArray *bookmarkCopy = [bookmarkArray copy];
[issueArray addObject:bookmarkCopy];
[bookmarkCopy release];

如果您不需要副本可变。

答案 2 :(得分:0)

他们极有可能引用相同的对象。你能检查一下吗?

答案 3 :(得分:0)

Tommy和taskinoor的解释是正确的。但是,如果您的目标是使issueArray包含bookmarkArray中的对象,请执行以下操作:

[issueArray addObjectsFromArray:bookmarkArray];
[bookmarkArray removeAllObjects];

确保你清楚区别。在taskinoor的代码中,您将一个对象添加到bookmarkArray,该对象本身就是一个数组。在上面的行中,您要将[bookmarkArray count]个对象添加到issueArray。