1

使用 NSMutableArray 遇到问题。遇到将空 mutableArrays 添加到 NSMutableArray 的要求。当我删除最后一个数组时,之前添加的所有数组也会从父数组中删除。代码在这里,

NSMutableArray *collections = [[NSMutableArray alloc] init];

NSMutableArray *bookSet1 = [[NSMutableArray alloc] init];
[collections addObject:bookSet1];

NSMutableArray *bookSet2 = [[NSMutableArray alloc] init];
[collections addObject:bookSet2];

NSLog(@"bookSet1==bookSet2 %d", bookSet1==bookSet2);

[collections removeObject:bookSet2];

NSLog(@"Collections count==%d", [collections count]);

结果

ArrayTest[2356:c07] bookSet1==bookSet2 0 ArrayTest[2356:c07] 集合计数==0

检查它们是否具有相同的引用,但 equals 方法返回 false,因此它们肯定没有指向相同的内存位置。不知道为什么会有这样的行为。任何可能的解决方案来克服这一点。

4

2 回答 2

9

检查它们是否具有相同的引用但equals方法返回false

不。您没有使用isEqual. 如果你使用过isEqual:,你会得到1(即,YES)。

NSMutableArray(以及所有基本的 Cocoa 集合类)用于isEqual:确定两个对象是否相同。这个方法可以被覆盖,如果它们的内容在概念上被认为是相同的,它通常用于使对象比较相等,而不仅仅是它们的内存地址相同(如果后者是真的,我们不能比较字符串或任何类似的对象安全,例如)。

您无法真正克服这一点,因为removeObject:. 如果由于某种原因不能使用它,您始终可以使用该removeObjectIdenticalTo:方法,该方法使用内存地址进行比较(此处的文档)。

于 2013-03-14T15:10:13.087 回答
0
  1. removeObject: 匹配是根据对象对 isEqual: 消息的响应来确定的。即,如果对象的内容相同,则认为对象相同。

  2. removeObjectIdenticalTo: 匹配是使用对象地址确定的。即,如果对象地址相同,则认为对象相同。

尝试

[collections removeObjectIdenticalTo:bookSet2];

这将根据地址删除您要删除的确切对象。

于 2013-03-14T15:48:43.263 回答