OC中,==号比较两个对象,是比较两个对象的地址,而 isEqual方法,是比较两个对象的值是否相等。
比如,NSString *str1 = @"1",NSString *str2 = @"1",NSString *str3 = [NSString stringWithFormat:@"1"];
BOOL flag1 = str1 == str2 ,flag1为true,因为对应@“1”,属于同一个常量被两个变量引用,它们指向的地址是相同的
BOOL flag2 = str1 == str3 ,flag2为false,因为str3是通过stringWithFormat创建,是重新分配了内存空间的,
BOOL flag3 = [str1 isEqualToString str2] ,flag3为true,因为isEqual方法是判断两个对象的值,并不关心内存地址
对于字符串,需要用isEqualToString来判断两个字符串是否相等,
对于其他继承自NSObject的对象呢,一般用isEqual来判断是否相等,千万不要用 ==,因为同一个类alloc出来的两个对象,地址是绝对不同的。
isEqual的原理,就要说到两个方法hash与isEqual,
OC的基类是NSObject,有两个对象方法
- (NSUInteger)hash
{
NSString *toHash = [NSString stringWithFormat:@"%ld", self.modelId];
return [toHash hash];
}
- (BOOL)isEqual:(id)object
{
return [self hash] == [object hash];
}
只要实现这两个方法,就可以让同一个类alloc出来的不同对象,满足某个条件时相等,这里用的是modelId
也就是只要两个对象的modelId属性相等,用isEqual方法判断两个对象,它们就相等
NSArray的contains方法,就是根据这个来判断某个对象是否包含在这个数组里的。