比较Obj-C中的对象

时间:2011-02-20 01:35:14

标签: objective-c

如何比较Objective-C中的对象?

是否像==一样简单?

我想检查一个对象的数组,如果它不存在则将其添加到数组中,否则将其从数组中删除。

4 个答案:

答案 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:的方法。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/isEqual

因此,您希望为自定义对象类型覆盖此内容。

文档中的一个特别重要的注释:

  

如果两个对象相等,则必须   具有相同的哈希值。最后一个   如果你这一点特别重要   define isEqual:在子类中   打算把它的实例   子类成集合。确保   你也可以在你的子类中定义哈希。

答案 2 :(得分:4)

==将比较指针,您需要覆盖

- (BOOL)isEqual:(id)anObject

答案 3 :(得分:2)

实现isEqual:和hash

根据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;
}
相关问题