1:关于(==)的使用
当使用“==”时,大多时候用来比较基本数据类型。当在比较对象类型时,比较的是对象的地址,表示是否为同一个对象
2:关于(equal)的使用
用于比较对象类型,是NSObject的方法,
源代码如下
+ (BOOL)isEqual:(id)obj {
return obj == (id)self;
}
- (BOOL)isEqual:(id)obj {
return obj == self;
}
可以看到是用对象(obj)和调用者当前的类用“==”做比较。所有检查是指针是否相等,如果相等直接返回YES。
实例(==、isequal)比较代码如下
1:比较基本数据类型和对象类型(==,isequal)
NSString * a = [NSString stringWithFormat:@"%@",@"小朋友,你是不是有很多问好"];
NSString * b = @"小朋友,你是不是有很多问好";
NSLog(@"a:%p==b:%p",&a,&b);
NSLog(@"a==b->:%d==[a isEqual:b]%d",a==b,[a isEqual:b]);
打印的输出结果为:
1:a:0x7ffee1ae28b8==b:0x7ffee1ae28b0
2:a==b->:0==[a isEqual:b]1
ps:虽然由【isEqual】源代码看,只比较了指针(利用==比较),但是在用【isEqual】比较对象的内容相同时也返回了【YES】
所以的isequal的比较是分三步
- 就是==。检查顺序是先检查指针是否相等,相等直接返回YES
- 再检查类的等同性空或者非同类则直接返回NO。
- 最后检查对象的参数跟类名,都相同则返回YES
在用一个UIColor
类型比较,强烈证明还是属性的判断
UIColor *colorA = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:1.0];
UIColor *colorB = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:1.0];
NSLog(@"colorA:%p==colorB:%p",&colorA,&colorB);
NSLog(@"colorA==colorA:%d<==>[colorA isEqual:colorB] = %d",colorA==colorB, [colorA isEqual:colorB]);
输出内容如下:
1:colorA:0x7ffee2c148b8==colorB:0x7ffee2c148b0
2:colorA==colorA:0<==>[colorA isEqual:colorB] = 1
3:isEqual方法内部实现
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToWidget:other];
}
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
if (self == aWidget)
return YES;
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
if (![[self data] isEqualToData:[aWidget data]])
return NO;
return YES;
}
```
可以看到检查步骤如下
1. 直接判断两个对象的内存地址是否相等,若相等,则其均指向同一个对象
2. 比较两个对象的类型,若不属于同一类型,则两对象不相等
3. 检查对象的每一个属性是否相等,只要其中有不相等的属性,则两个对象不相等
#### 4:项目中重写isEqual方法
在自定义的Person的类中重写isEqual方法
```objc
-(BOOL)isEqual:(id)object{
/*
self指当前制定的类的信息
而object
是指在当值数据池中的数据
*/
if (self == object) {
return YES;
}
if (![object isKindOfClass:[Person class]]) {
return NO;
}
// 自定义的属性比较
// return [self userName]==[(Person *)object userPwd];
// return [self userName] == [self userPwd];
// return (
// [(Person *)object userName]==[(Person *)object userPwd] ||
// [[(Person *)object userName] isEqual:@"H"]);
//
return YES;
}
```
#### 5:关于(isEqualToString)的使用
这个就很难简单了,直接判断字符串内容是否相等
![如果觉得有用就关注吧](https://img.haomeiwen.com/i1416781/baf37cb076b84f0a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
网友评论