如何比较Objective-C中的对象?
是否像==一样简单?
我想检查一个对象的数组,如果它不存在则将其添加到数组中,否则将其从数组中删除。
答案 0 :(得分:18)
比较Objective-C中的对象与Java或其他面向对象语言中的对象非常相似:
==
比较对象引用;在Objective-C中,它们是否占用相同的内存地址。isEqual:
,在NSObject上定义的方法,检查两个对象是否“相同”。您可以覆盖此方法以为对象提供自己的相等性检查。所以一般来说,做你想做的事,你会这样做:
if(![myArray containsObject:anObject]) {
[myArray addObject:anObject];
}
这是有效的,因为Objective-C数组类型NSArray有一个名为containsObject:
的方法,它将isEqual:
消息发送到它包含的每个对象,并将对象作为参数。除非==
的实施依赖于isEqual:
,否则它不会使用==
。
如果您完全使用您实现的对象,请记住您可以覆盖isEqual:
以提供您自己的相等性检查。通常这是通过比较对象的字段来完成的。
答案 1 :(得分:11)
每个Objective-C对象都有一个名为isEqual:
的方法。
因此,您希望为自定义对象类型覆盖此内容。
文档中的一个特别重要的注释:
如果两个对象相等,则必须 具有相同的哈希值。最后一个 如果你这一点特别重要 define isEqual:在子类中 打算把它的实例 子类成集合。确保 你也可以在你的子类中定义哈希。
答案 2 :(得分:4)
==将比较指针,您需要覆盖
- (BOOL)isEqual:(id)anObject
答案 3 :(得分:2)
根据Apple documentation on NSObject,您至少需要实施isEqual:
和hash
。下面你将找到一种实现对象相等的方法,当然如何实现hash
在StackOverflow上进入严肃辩论的土地,但这将有效。一般规则 - 您需要定义构成对象相等性的内容,并且对于每个唯一对象,它们应该具有唯一的哈希。最佳做法是添加对象特定的相等方法,例如NSString
具有isEqualToString:
。
- (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;
}