containsObject 总是不含有,你会用吗
結(jié)論:containsObject:是在比較內(nèi)存地址,即使兩個(gè)對(duì)象內(nèi)容完全一樣,地址不同,那也是不同的。我個(gè)人認(rèn)為這個(gè)方法應(yīng)該叫是否存在同一個(gè)對(duì)象
(開(kāi)始不知道這個(gè)知識(shí),被坑,至少浪費(fèi)了3個(gè)鐘頭,數(shù)組里對(duì)象內(nèi)容一樣,就是不包含這個(gè)對(duì)象,MMP,自己無(wú)知怪誰(shuí)呢)
?
?? ? ? Person中包含name和age,分別表示名字和年齡,數(shù)組中包含多個(gè)Person,我們的目的是,如果數(shù)組中存在同樣的人名,并且年齡完全相同,就舍棄新的Person,如何實(shí)現(xiàn)這個(gè)需求呢?我們需要重載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里調(diào)用時(shí):?
| - (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]); ?? ? } |
?
最終結(jié)果,打印1,證明aArray里含有了一個(gè)姓名為zhangsan、年齡為18的人。因?yàn)镻erson.m里的兩個(gè)方法,聲明了只要姓名和年齡內(nèi)容相同,就認(rèn)為是同一個(gè)人。
如果注釋掉Person.m里的兩個(gè)方法,會(huì)打印0,因?yàn)橄到y(tǒng)默認(rèn)的containsObject,比較對(duì)象的內(nèi)存地址,C和A內(nèi)存地址不一樣,所以默認(rèn)會(huì)被認(rèn)為不含有C,而含有A。
轉(zhuǎn)載于:https://www.cnblogs.com/huangzs/p/11219235.html
總結(jié)
以上是生活随笔為你收集整理的containsObject 总是不含有,你会用吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。