Objective c 在Obj-C中比较对象
如何比较Objective-C中的对象 它像==一样简单吗Objective c 在Obj-C中比较对象,objective-c,Objective C,如何比较Objective-C中的对象 它像==一样简单吗 我想检查数组中的对象,如果它不存在,则将其添加到数组中,否则,将其从数组中删除。==将比较指针,您需要覆盖 - (BOOL)isEqual:(id)anObject 每个Objective-C对象都有一个名为isEqual:的方法 : 因此,您可能希望为自定义对象类型覆盖此选项 文件中有一个特别重要的注释: 如果两个对象相等,则它们必须相等 具有相同的哈希值。这最后 这一点特别重要,如果你 定义isEqual:在子类中,并且 我打算举
我想检查数组中的对象,如果它不存在,则将其添加到数组中,否则,将其从数组中删除。==将比较指针,您需要覆盖
- (BOOL)isEqual:(id)anObject
每个Objective-C对象都有一个名为
isEqual:
的方法
:
因此,您可能希望为自定义对象类型覆盖此选项
文件中有一个特别重要的注释:
如果两个对象相等,则它们必须相等
具有相同的哈希值。这最后
这一点特别重要,如果你
定义isEqual:在子类中,并且
我打算举例说明这一点
将子类化为集合。确保
您还可以在子类中定义hash
在Objective-C中比较对象的工作原理与在Java或其他面向对象语言中的工作原理基本相同:
比较对象引用;在Objective-C中,它们是否占用相同的内存地址==
,一个在上定义的方法,用于检查两个对象是否“相同”。您可以重写此方法以为对象提供自己的相等性检查isEqual:
if(![myArray containsObject:anObject]) {
[myArray addObject:anObject];
}
这是因为Objective-C数组类型有一个名为containsObject:
的方法,它将isEqual:
消息发送到它包含的每个对象,并将对象作为参数。它不使用=
,除非isEqual:
的实现依赖于=
如果您完全使用您实现的对象,请记住您可以覆盖isEqual:
,以提供您自己的相等性检查。通常这是通过比较对象的字段来完成的。实现isEqual:和哈希
根据,您至少需要实现isEqual:
和哈希值。下面,您将找到一种实现对象相等的方法,当然,如何实现hash
在这里进入了关于StackOverflow的激烈争论的领域,但这将起作用。一般规则-您需要定义什么构成对象相等,并且对于每个唯一的对象,它们应该具有唯一的散列。最佳做法是添加特定于对象的相等方法,例如NSString
hasisEqualToString:
- (BOOL)isEqual:(id)object
{
BOOL result = NO;
if ([object isKindOfClass:[self class]]) {
CLPObject *otherObject = object;
result = [self.name isEqualToString:[otherObject name]] &&
[self.shortName isEqualToString:[otherObject shortName]] &&
[self.identifier isEqualToString:[otherObject identifier]] &&
self.boardingAllowed == [otherObject isBoardingAllowed];
}
return result;
}
- (NSUInteger)hash
{
NSUInteger result = 1;
NSUInteger prime = 31;
result = prime * result + [_name hash];
result = prime * result + [_shortName hash];
result = prime * result + [_identifier hash];
result = prime * result + _boardingAllowed;
return result;
}
)太好了。非常感谢。我正在使用==并且它似乎有效。什么更有效率?我会遇到==的问题吗?我将使用containsObject,但我只想知道。==
通常更有效,因为它是一个单一的算术比较,而不是涉及方法调用的(可能广泛的)自定义比较,但是使用isEqual:
更可靠,并且几乎总是提供更好的结果。它也更具前向兼容性-如果将来需要新的isEqual:
实现,不仅需要编写它,还需要将所有=
重新编码为isEqual:
。如果您现在这样做,您只需实现isEqual:
即可使用=
,并在以后根据需要进行更改。此处的相关技术术语为身份和平等=
询问它们是否相同(它们是相同的对象实例),而isEqual
询问它们是否相等(有时,根据类型语义,两个单独的实例被视为相等)。方法是isEqual:
(带冒号)。冒号有很大的不同。+1用于添加关于覆盖哈希的注释。在某些情况下,containsObject似乎会使用hash方法而忽略isEqual:我认为您的意思是“重写”,而不是“重载”。