NSMutableArray具有相同的参考

时间:2013-03-14 15:03:00

标签: iphone ios objective-c

使用NSMutableArray.Came解决将空mutableArrays添加到NSMutableArray的要求。当我删除最后一个数组时,之前添加的所有数组也从Parent数组中删除。代码在这里,

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,因此它们肯定不指向相同的内存位置。不知道为什么行为是这样的。任何可能的解决方案来克服这个问题。

2 个答案:

答案 0 :(得分:9)

  

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

罗。您没有使用isEqual检查相等性。如果您使用过isEqual:,则会得到1(即YES)。

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

您无法真正克服这一点,因为removeObject:这是 预期和概念上正确的行为。如果出于某种原因,您无法使用它,则可以始终使用removeObjectIdenticalTo:方法,该方法使用内存地址进行比较(documentation here)。

答案 1 :(得分:0)

  1. removeObject: 匹配是根据对象对isEqual:message的响应确定的。例如,如果对象的内容相同,则视为相同。< / p>

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

  3. 尝试

    [collections removeObjectIdenticalTo:bookSet2];
    

    这将删除您要删除的确切对象,以地址为基础。