如何判断对象等同?
在NSObject协议中有2个方法用于判断等同性,我么分别去了解它们是如何实现的:
-
- (BOOL)isEqual:(id)object
; - (NSUInteger)hash;
isEqual
我们平时最常用的是第一种,代码如下:
NSString *foo = @"Mcyboy 123";
NSString *bar = [NSString stringWithFormat:@"Mcyboy 123"];
BOOL equalA = (foo == bar); //NO
BOOL equalB = [foo isEqual:bar]; //YES
BOOL equalC = [foo isEqualToString:bar]; //YES
解释:
==
:比较两个指针的内存地址,而不是指针所指的对象。
isEqualToString
:判断2个字符串是否相等,速度比isEqual方法块。
isEqual
:通用方法,判断两个对象是否相等。因为没有参数对象的类型,需要执行额外的步骤。
2)如果碰到非OC基本数据类型需要比较等同性,我们该如何去做?通常的做法是,如果比较的两个对象属于同一个类,则调用该类的判定方法;否则,交由超类比较。
怎么理解?看如下代码:
//@property NSString *name;
//@property NSDate *birthday;
- (BOOL)isEqualToPerson:(Person *)person {
if (self == person) return YES;
if (![_name isEqualToString:person.name]) {
return NO;
}
if (![_birthday isEqualToDate:person.birthday]) {
return NO;
}
return YES;
}
- (BOOL)isEqual:(id)object {
if ([self class] == [object class]) {
return [self isEqualToPerson:(Person *)object];
} else {
return [super isEqual:object];
}
}
- (NSUInteger)hash {
return [self.name hash] ^ [self.birthday hash];
}
解析:
- 1.判断2个person对象是否相等时,我们调用
isEqual:
方法。如果是同类型,则调用isEqualToPerson
方法,如果不是,丢给超类判断。 -
name
和birthday
都有各自的类型,分别为NSString
和NSDate
,直接调用系统的判定方法即可。
-
hash
两个对象相等,他们的hash值必定相等;但是hash值相等,两个对象不一定相等。
hash的实现方法就不多介绍了。