前言
根據(jù)“等同性”來比較對象是一個非常有用的功能晤揣。不過旗芬,按照 == 操作符比較出來的結(jié)果未必是我們想要的瘤睹,因為該操作比較的是兩個指針本身升敲,而不是其所指的對象。應(yīng)該使用NSOject協(xié)議中聲明的“isEqual”:方法來判斷兩個對象的等同性轰传。一般來說驴党,兩個類型不同的對象總是不相等的。下面的例子:
NSString *test1 = @"test";
NSString *test2 = [NSString stringWithFormat:@"%@",@"test"];
BOOL boolA = (test1 == test2); // NO
BOOL boolB = [test1 isEqual:test1]; // YES
BOOL boolC = [test1 isEqualToString:test2]; // YES
從例子中可看到 == 與等同性判斷方法的差別获茬,NSString自己實現(xiàn)一個等同性判斷方法港庄,名叫“isEqualToString:”。
NSOject協(xié)議中有兩個用于判斷等同性的關(guān)鍵方法:
// 判斷兩個對象是否相等(可以自定義規(guī)則)
- (BOOL)isEqual:(id)object ;
- (NSUInteger)hash ;
NSOject類對這兩個方法的默認(rèn)實現(xiàn)是:當(dāng)且僅當(dāng)其內(nèi)存地址完全相等時對象才相等恕曲。我們可以通過覆寫上面的方法鹏氧,自定義判斷連個對象是否相等。
比如下面這個類
@interface Person : NSObject
@property (nonatomic,copy) NSString*firstName;
@property (nonatomic,copy) NSString*lastName;
@property (nonatomic,assign) NSUInteger age;
@end
如果我比較的規(guī)則是:Person的所有字段都相等佩谣,那么這兩個對象就相等把还。
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if ([self class] != [object class]) {
return NO;
}
Person *p = (Person*)object;
if (![_firstName isEqualToString:p.firstName]) {
return NO;
}
if (![_lastName isEqualToString:p.lastName]) {
return NO;
}
if (_age!=p.age) {
return NO;
}
return YES;
}
- (NSUInteger)hash {
// 第一種 return 3122;
// 第二種
// NSString *stringToHash = [NSString stringWithFormat:@"%@:%@:%i",_firstName,_lastName,_age];
//
// return [stringToHash hash];
// 第三種(推薦,相比第二種方式,第三種不需要再創(chuàng)建一個字符串茸俭,性能肯定比第二種快)
NSUInteger fistNameHash = [_firstName hash];
NSUInteger lastNameHash = [_lastName hash];
NSUInteger ageHash = _age;
return fistNameHash^lastNameHash^ageHash;
}
另外我們還可以根據(jù)自己需求定制不能規(guī)則來判斷兩個對象是否相同吊履。