containsObject:

按官方文档中的说法,containsObject:会从index=0开始,遍历元素执行isEqual:方法,有相等的值则返回true.

isEqual:

遍历元素执行isEqual:方法,isEqual就比较有意思了:

  1. 容器类型,容器中对应元素都相等,则返回true。(有关使用此方法的示例,请参阅NSData,NSDictionary,NSArray和NSString类规范)

  2. 如果两个对象相等,必须保证具有相同的哈希值

  3. 如果在子类中定义isEqual:并将该子类的实例放入集合中,最后一点尤为重要。 确保你也在你的子类中定义哈希。

NSArray

NSMutableArray *arr1 = @[@22,@22,@22,@"aa"].mutableCopy;
NSMutableArray *arr2 = @[@22,@22,@22,@"aa"].mutableCopy;
NSLog(@"是否相等%d",[arr1 isEqual:arr2]);//是否相等1

NSMutableArray *arr1 = @[@"aa",@22].mutableCopy;
NSMutableArray *arr2 = @[@22,@"aa"].mutableCopy;
NSLog(@"是否相等%d",[arr1 isEqual:arr2]);//是否相等0

NSString

NSString: 两个字符串之间比较isEqual:isEqualToString:效果是一样的,但是后者比前者快。

NSDictionary

key可以为任何对象(要符合NSCopying协议)。keyvalue都不能为零; 如果需要在字典中表示空值,则应使用NSNull。

NSDictionary *dic = @{
                     @"null" : [NSNull null],
                     @"value1": @"value1",
                     @[@1,@2,@3]:@"123"
                     };
    
NSDictionary *dic2 = @{
                      @[@1,@2,@3]:@"123",
                     @"null" : [NSNull null],
                     @"value1": @"value1"
                     };
    
NSLog(@"字典值比较: %d",[dic isEqual:dic2]); //1

removeObject

也会通过isEqual:比较元素

NSMutableArray *arr1 = @[@22,@22,@22,@"aa"].mutableCopy;
[arr1 removeObject:@22];    
NSLog(@"%@",arr1);   //得到[@"22"] 

字典: setValue:forKey和setObject:forKey区别

setObject:forKey:原生的方法,按字典的规矩来。

setValue:forKey:属于kvc。 需要保证key为字符串

有人说官方文档中setValue:forKey会调用setObject:forKey的方法,还没验证.

setValue:forKey如果value ==nil ,会调用removeObjectForKey: