0

我有一个 NSMutableOrdered 集,其中包含两种类型的对象(我创建的),即 Pieces 和 Others。

Piece 和 Other 都有它们的 isEqual 方法,如下所示:

片:

- (BOOL)isEqual:(Piece *)object
{
    if (([title isEqualToString:[object title]])
        && ([composer isEqualToString:[object composer]])
        && (major == [object major])
        && (tempo == [object tempo])
        && (pieceKey == [object pieceKey])
        && (pieceTime == [object pieceTime]))
        return YES;
    else 
        return NO;
}

其他:

- (BOOL)isEqual:(Other *)object
{
    if (([title isEqualToString:[object title]])
        && ([subTitle isEqualToString:[object subTitle]])
        && ([description isEqualToString:[object description]])
        && (otherTime == [object otherTime]))
        return YES;
    else 
        return NO;
}  

我还覆盖了两个类的散列,为每个实例创建一个唯一的散列(通过获取 ivars 的 int 值并添加它们)。

在我的应用程序中,从集合中删除了另一个,然后当我尝试向集合中添加一块时,我得到了这个:

-[Other isEqual:]: message sent to deallocated instance 0x80d5680

这是哈希方法:

- (NSUInteger)hash
{
    NSUInteger prime = 31;
    NSUInteger result = 1;
    result = prime * (result + [title intValue]);
    result = prime * (result + [composer intValue]);
    result = prime * (result + major);
    result = prime * (result + tempo);
    result = prime * (result + pieceKey);
    result = prime * (result + pieceTime);
    return result;
}

如果有人知道为什么会这样,我真的会提供一些帮助。

谢谢,

4

2 回答 2

2

这不是一个真正的答案,但它会帮助我们找到问题所在。一些问题:

  • 您确定 0x80d5680 是之前删除的实例吗?
  • 你如何将它从集合中移除?
  • 添加对象后,您是否修改了对象的状态?
  • 您确定您的哈希值是唯一的(ivars 的 int 值总和听起来很可疑)。

最后,确保您的对象遵守此规则:

如果两个对象相等,则它们必须具有相同的哈希值。如果您在子类中定义 isEqual: 并打算将该子类的实例放入集合中,那么最后一点尤其重要。确保您还在子类中定义哈希。

有关详细信息,请参阅NSObject 协议参考

于 2012-04-26T15:38:51.977 回答
0

我相信 isEqual 作为集合比较的一部分在成员上被调用,因为集合是一组独特的项目。也许您应该在从旧集合中删除之前将成员添加到新集合中?

希望这可以帮助!

于 2012-04-26T15:26:18.613 回答