containsObject 总是不含有,你会用吗

时间:2024-01-25 18:52:07

结论:containsObject:是在比较内存地址,即使两个对象内容完全一样,地址不同,那也是不同的。我个人认为这个方法应该叫是否存在同一个对象

(开始不知道这个知识,被坑,至少浪费了3个钟头,数组里对象内容一样,就是不包含这个对象,MMP,自己无知怪谁呢)

 

       Person中包含name和age,分别表示名字和年龄,数组中包含多个Person,我们的目的是,如果数组中存在同样的人名,并且年龄完全相同,就舍弃新的Person,如何实现这个需求呢?我们需要重载isEqual方法。

Person.h

@interface Person : NSObject

@property NSString *name;

@property NSInteger age;

@end

 

Person.m 

@implementation Person

- (BOOL)isEqualToPerson:(Person *)person {

    if (!person) {

        return NO;

    }

    BOOL bIsEqualNames = [self.name isEqualToString:person.name];

    BOOL bIsEqualAges = self.age == person.age;

    return bIsEqualNames && bIsEqualAges;

}

 

#pragma mark - 重载isEqual方法

- (BOOL)isEqual:(id)object {

    if (self == object) {

        return YES;

    }

    

    if (![object isKindOfClass:[Person class]]) {

        return NO;

    }

    return [self isEqualToPerson:(Person *)object];

}

@end

 


viewController里调用时: 

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    

    Person *A = [[Person alloc]init];

    A.name=@"zhangsan";

    A.age=18;

    

    Person *B = [[Person alloc]init];

    B.name=@"lisi";

    B.age=15;

    

    NSMutableArray *aArray = [[NSMutableArray alloc]init];

    [aArray addObject:A];

    [aArray addObject:B];

    

    Person *C = [[Person alloc]init];

    C.name=@"zhangsan";

    C.age=18;

    

    NSLog(@"%ld",[aArray containsObject:C]);

    

}

 

最终结果,打印1,证明aArray里含有了一个姓名为zhangsan、年龄为18的人。因为Person.m里的两个方法,声明了只要姓名和年龄内容相同,就认为是同一个人。

如果注释掉Person.m里的两个方法,会打印0,因为系统默认的containsObject,比较对象的内存地址,C和A内存地址不一样,所以默认会被认为不含有C,而含有A。