2012-06-07 28 views
1

苹果指南isEqual说:什么是isEqual检查?

返回一个布尔值,指示接收器和 给定对象是否相等。 (必需)

该方法定义意味着什么情况下是相等的。例如,对于 示例,如果其对应的对象都对isEqual:请求回应YES,则容器对象可能会将两个容器定义为相等。 请参阅NSData,NSDictionary,NSArray和NSString类 规范中使用此方法的示例。

如果两个对象相等,它们必须具有相同的散列值。在 子类,并打算把该子类的实例为 集合:如果你定义isEqual这 最后一点尤为重要。确保你也在你的子类中定义了散列。

所以我的问题是,如果我想比较两个UIButtons或使用isEqual 2个UILabels(二UIViews),并事先如果他们的类是同一类我检查,然后调用isEqual,什么是越来越检查?属性,值,动作消息,目标对象正在检查?

感谢

+1

isEqual对于像视图一样复杂的东西可能不是正确的选项。你能说你究竟在做什么,而不是你目前如何去做? – jrturton

+0

我想比较两个视图是否相同,所以我检查所有的子视图,并且一个一个地查看它们的属性,例如如果有uibuttons和uilabels我想比较他们在这个视图和其他视图 –

回答

0

的isEqual:方法NSObject的的方法检查两个对象的散列是否相等。实际上,散列是实例的地址(如果未被覆盖)。但是,在简单数据容器类中,isEqual被重写,例如,NSString的isEqual:方法调用isEqualToString:在检查被比较的对象是NSString实例之后。正如我之前提到的,同样适用于NSData,NSNumber,NSDate,NSArray和NSDictionary。但是,UIView(及其所有父母)不会重写isEqual:因为没有明确的方式来决定两个视图是否相等。你最好比较另一个更重要的视图属性来检查。

+0

不,'-isEqual:'方法不检查'-hash'。首先,散列对于不相等的对象可以是相同的。 'NSObject'实现只是比较对象指针是否相等。也就是说,一个对象只等于它自己。 –

+0

@KenThomases'-isEqual:'肯定会检查'-hash'(但不仅限于此)。这就是为什么苹果在文档中声明,如果你选择重写'-isEqual:'你也必须重写'hash'。 – Alladinian

+0

你必须重写'-hash'以维持它们之间的关系(不同的哈希表示不等于,相等意味着相同的哈希),但这并不意味着'-isEqual:'检查哈希。事实上,如果是这样,那么就不需要两者都改变​​。只要改变一个就足够了。 –

0

不,不的isEqual看到了指针的内存地址进行简单的检查,如果他们是同一个对象。你必须使用其他一些方法来检查按钮是否有相同的标题,但是是两个单独的按钮实例。

+3

不完全。出于充分的原因,isEqual在容器类上被覆盖。 – 2012-06-07 17:52:03

+0

没错,但他在UIbuttons和Uilabels的背景下询问过它。 –