结论: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。