(面试)== 和isequal、isEqualToString区别

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的比较是分三步

  1. 就是==。检查顺序是先检查指针是否相等,相等直接返回YES
  2. 再检查类的等同性空或者非同类则直接返回NO。
  3. 最后检查对象的参数跟类名,都相同则返回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)的使用

这个就很难简单了,直接判断字符串内容是否相等



##### 如果你觉得可以添加"洲洲哥“

你可能感兴趣的:((面试)== 和isequal、isEqualToString区别)