结论: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 && !person.name) || [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。