我們已經(jīng)知道NSSet是一個保證唯一性的集合之宿,但是它是如何保證唯一性的呢咪笑,調(diào)用addObject時是如何判斷唯一性的呢?
創(chuàng)建一個測試類繼承于NSObject,如下:
//NSTest.h
#import <Foundation/Foundation.h>
@interface NSTest :NSObject
@end
NSTest.m什么也不做除嘹,測試代碼如下:
NSMutableSet* setA = [NSMutableSet new];
NSTest* test1 = [[NSTest alloc]init];
[setA addObject:test1];
NSTest* test2 = [[NSTest alloc]init];
[setA addObject:test2];
NSLog(@"setA : %@", setA);
打印結(jié)果是setA里面有2個NSTest的對象
接著修改NSTest.m,添加2個繼承自NSObject的函數(shù)
- (BOOL)isEqual: (id)other
{
return YES;
}
- (NSUInteger)hash
{
return 1;
}
這時候再執(zhí)行之前的測試代碼岸蜗,setA里面就只有一個NSTest對象了
也就是說set是根據(jù)hash函數(shù)和isEqual來確定一個對象是否已經(jīng)存在于set內(nèi)尉咕,再深入點修改這2個函數(shù)的不同返回值,就會發(fā)現(xiàn)璃岳,是先判斷2個對象的hash值是否一致年缎,如果一致再判斷其isEqual值。
明白了這點铃慷,就可以通過重寫isEqual和hash來定制我們自己的業(yè)務(wù)流程单芜,使用set來做唯一性判斷了。