gpt4 book ai didi

iphone - 尝试将对象添加到 MutableOrderedSet 时发送到释放实例的 IsEqual 方法

转载 作者:行者123 更新时间:2023-11-28 22:58:48 24 4
gpt4 key购买 nike

我有一个 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;
}

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

在我的应用程序中,An Other 被从集合中移除,然后当我尝试向集合中添加一 block 时,我得到了这个:

-[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;
}

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

谢谢,

最佳答案

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

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

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

If two objects are equal, they must have the same hash value. This last point is particularly important if you define isEqual: in a subclass and intend to put instances of that subclass into a collection. Make sure you also define hash in your subclass.

参见 NSObject Protocol Reference获取更多信息。

关于iphone - 尝试将对象添加到 MutableOrderedSet 时发送到释放实例的 IsEqual 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10336387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com