我們已經知道NSSet是一個保證唯一性的集合,但是它是如何保證唯一性的呢,調用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);
打印結果是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來確定一個對象是否已經存在于set內,再深入點修改這2個函數(shù)的不同返回值,就會發(fā)現(xiàn),是先判斷2個對象的hash值是否一致,如果一致再判斷其isEqual值。
明白了這點,就可以通過重寫isEqual和hash來定制我們自己的業(yè)務流程,使用set來做唯一性判斷了。