从containsObject浅谈到对象地址、isEqual和hash值

近期修正一个上个程序员写的代码bug,用到了containsObject这个方法,这是个数组对象方法,深究了一下,大概有以下几种用法,肯定有似懂非懂的同学,容我来解惑一二。

1、检测数组中是否存在某个字符串

 NSString *str1 = @"123";
 NSString *str2 = @"345";
 NSMutableString *str3 = [NSMutableString stringWithString:@"123"];
 NSArray *strArray = @[str1, str2, str3];
 NSMutableArray *testStrArray = [NSMutableArray array];
for (int i = 0; i<3; i++) {
    [testStrArray containsObject:strArray[i]]?:[testStrArray addObject:strArray[i]];
}

2、

LLZLabel *l1 = [[LLZLabel alloc] init];
l1.text = @"llz";
LLZLabel *l2 = [[LLZLabel alloc] init];
l2.text = @"llz";
NSUInteger sss1 = l1.hash;
NSLog(@"%zd",sss1);
NSUInteger sss2 = l2.hash;
NSLog(@"%zd",sss2);
NSMutableArray *testStrArray = [NSMutableArray array];
[testStrArray addObject:l1];
BOOL qqq = [testStrArray containsObject:l2];
NSLog(qqq?@"YES":@"NO");

每个对象都有一个hash值,一般来说不同对象就算内容一样,hash值也是不同的。但不同地址的字符串,如果内容一致,那么hash值也是一样的。而isEqual方法和containsObject方法比较的就是两个对象的hash值,通过上面的两个方法打印一下就能得出。(isEqual返回yes的情况说明两个对象的hash值相同,而两个对象的hash值相同并不能推导出isEqual返回yes)

你可能感兴趣的:(从containsObject浅谈到对象地址、isEqual和hash值)