Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Obj-C中比较对象_Objective C - Fatal编程技术网

Objective c 在Obj-C中比较对象

Objective c 在Obj-C中比较对象,objective-c,Objective C,如何比较Objective-C中的对象 它像==一样简单吗 我想检查数组中的对象,如果它不存在,则将其添加到数组中,否则,将其从数组中删除。==将比较指针,您需要覆盖 - (BOOL)isEqual:(id)anObject 每个Objective-C对象都有一个名为isEqual:的方法 : 因此,您可能希望为自定义对象类型覆盖此选项 文件中有一个特别重要的注释: 如果两个对象相等,则它们必须相等 具有相同的哈希值。这最后 这一点特别重要,如果你 定义isEqual:在子类中,并且 我打算举

如何比较Objective-C中的对象

它像==一样简单吗


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

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

- (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
has
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;
}

)太好了。非常感谢。我正在使用==并且它似乎有效。什么更有效率?我会遇到==的问题吗?我将使用containsObject,但我只想知道。
==
通常更有效,因为它是一个单一的算术比较,而不是涉及方法调用的(可能广泛的)自定义比较,但是使用
isEqual:
更可靠,并且几乎总是提供更好的结果。它也更具前向兼容性-如果将来需要新的
isEqual:
实现,不仅需要编写它,还需要将所有
=
重新编码为
isEqual:
。如果您现在这样做,您只需实现
isEqual:
即可使用
=
,并在以后根据需要进行更改。此处的相关技术术语为身份和平等
=
询问它们是否相同(它们是相同的对象实例),而
isEqual
询问它们是否相等(有时,根据类型语义,两个单独的实例被视为相等)。方法是
isEqual:
(带冒号)。冒号有很大的不同。+1用于添加关于覆盖哈希的注释。在某些情况下,containsObject似乎会使用hash方法而忽略isEqual:我认为您的意思是“重写”,而不是“重载”。