Objective c 什么是等质量检查?

Objective c 什么是等质量检查?,objective-c,uiview,Objective C,Uiview,isEqual的《苹果指南》中说: 返回一个布尔值,该值指示接收器和 给定的对象是相等的。(必选) 此方法定义实例相等的含义。对于 例如,一个容器对象可能会将两个容器定义为相等,如果 它们对应的对象都对isEqual:请求响应YES。 请参见NSData、NSDictionary、NSArray和NSString类 本方法使用示例的规范 如果两个对象相等,则它们必须具有相同的哈希值。这 最后一点特别重要,如果您在 子类,并打算将该子类的实例放入 收集确保在子类中也定义了hash 所以我的问题是,

isEqual的《苹果指南》中说:

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

此方法定义实例相等的含义。对于 例如,一个容器对象可能会将两个容器定义为相等,如果 它们对应的对象都对
isEqual:
请求响应YES。 请参见NSData、NSDictionary、NSArray和NSString类 本方法使用示例的规范

如果两个对象相等,则它们必须具有相同的哈希值。这 最后一点特别重要,如果您在 子类,并打算将该子类的实例放入 收集确保在子类中也定义了hash

所以我的问题是,如果我想使用
isEqual
比较两个UIButton或两个UILabel(两个UIView),并且事先我已经检查了它们的类是否是同一个类,然后调用
isEqual
,检查的是什么?是否检查了属性、值、操作消息和目标对象


谢谢

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

NSObject的isEqual:method检查两个对象的哈希是否相等。在实践中,如果没有覆盖哈希,则哈希就是实例的地址。但是,在简单的数据容器类上,isEqual被重写,例如,NSString的isEqual:方法在检查所比较的对象是否为NSString实例后调用isEqualToString:。正如我前面提到的,同样适用于NSData、NSNumber、NSDate、NSArray和NSDictionary。然而,UIView(及其所有父视图)并没有覆盖isEqual:因为没有明显的方法来决定两个视图是否被视为相等。您最好比较要检查的视图的另一个更重要的属性。

对于像视图这样复杂的对象,isEqual可能不是正确的选择。你能告诉我你到底想做什么,而不是你现在是怎么做的吗?我想比较两个视图是否相同,所以我检查所有的子视图,并逐个检查它们的属性,例如,如果有UIButton和UILabel,我想在这个视图和另一个视图中比较它们,但不完全一样。在容器类上重写isEqual有一个很好的理由。没错,但他是在UIbuttons和Uilabels的上下文中询问这个问题的。不,
-isEqual:
方法没有检查
-hash
。首先,对于不相等的对象,散列可以是相同的。
NSObject
实现只是比较对象指针是否相等。也就是说,一个对象只等于它自己。@KenThomases
-isEqual:
肯定会检查
-hash
(但不仅仅是这个)。这就是为什么苹果在文档中声明,如果你选择覆盖
-isEqual:
,你也必须覆盖
散列
。你必须覆盖
-hash
,以维持它们之间的关系(不同的散列意味着不相等,相等意味着相同的散列),但这并不意味着
-isEqual:
检查散列。事实上,如果是这样的话,那么就没有必要同时改变它们。只要换一个就够了。是10.6.8的CoreFoundation(i386)中的
NSObject
-isEqual:
实现。只需将
self
与参数进行比较。不调用
-hash
或任何其他内容: