項(xiàng)目開(kāi)發(fā)過(guò)程中可能會(huì)有這種需求,某個(gè)可變數(shù)組不斷地增加元素,同時(shí)我們需要判斷新的元素是否已經(jīng)在數(shù)組里,如果不在才添加該元素,否則丟棄。
基于以上的需求,很容易想到使用NSArray的containsObject方法。我們先來(lái)看看官方的介紹:
- (BOOL)containsObject:(ObjectType)anObject
anObject
An object.
Return Value
YES if anObject is present in the array, otherwise NO.
Discussion
Starting at index 0, each element of the array is passed as an argument to an isEqual: message sent to anObject until a match is found or the end of the array is reached. Objects are considered equal if isEqual: (declared in the NSObject protocol) returns YES.
對(duì)于普通的NSObject比較用isEqual:方法比較hash,而對(duì)于對(duì)于自己定義的類,直接使用containsObject會(huì)一直返回NO,原因是containsObject比較的是數(shù)組里的兩個(gè)對(duì)象,其hash值必然不一樣。比如以下自定義類:
@interface Person
@property NSString *name;
@property NSInteger age;
@end
@implementation Person
@end
Person中包含name和age,分別表示名字和年齡,數(shù)組中包含多個(gè)Person,我們的目的是,如果數(shù)組中存在同樣的人名,并且年齡完全相同,就舍棄新的Person,如何實(shí)現(xiàn)這個(gè)需求呢?我們需要重載isEqual方法。
- (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];
}
通過(guò)重載后,containsObject方法就能完美實(shí)現(xiàn)我們想要的功能。那么問(wèn)題來(lái)了,像以下代碼,會(huì)存在什么問(wèn)題?
NSMutableArrray *personArray = [[NSMutableArray alloc] init] ;
...
在某個(gè)controller中初始化了數(shù)組,該controller注冊(cè)了某個(gè)通知,有其他類每隔一定時(shí)間發(fā)送通知給controller,通知里包含person對(duì)象。當(dāng)前controller收到通知后,通過(guò)containObject方法過(guò)濾重復(fù)的person,然后保存到personArray 中。
通知的處理函數(shù)如下:
-(void)didReceiveNotification:(id)sender
{
...
Person *newPerson = [[sender userInfo] objectFor:@"person" ];//此處取出通知中的person對(duì)象
...(做一些其他運(yùn)算)
if(![personArray containsObject:newPerson ])
{
[personArray addObject:newPerson];
}
}
編輯:hfy
-
iOS
+關(guān)注
關(guān)注
8文章
3401瀏覽量
155493 -
數(shù)組
+關(guān)注
關(guān)注
1文章
420瀏覽量
27364
發(fā)布評(píng)論請(qǐng)先 登錄
瀚海微SD NAND/TF卡數(shù)據(jù)損壞與校驗(yàn)錯(cuò)誤(含CRC錯(cuò)誤、數(shù)據(jù)比對(duì)失敗)問(wèn)題解析
Cortex-M0+處理器的HardFault錯(cuò)誤介紹
分析負(fù)載特性時(shí),有哪些常見(jiàn)的錯(cuò)誤或誤區(qū)?
如何解決I/O時(shí)鐘布局器錯(cuò)誤
步進(jìn)電機(jī)EMC整改:不過(guò)關(guān)?常見(jiàn)誤區(qū)你可能正在犯
國(guó)巨貼片電容的電壓標(biāo)識(shí)有哪些常見(jiàn)錯(cuò)誤?
避雷!樹(shù)莓派初學(xué)者常犯的5個(gè)錯(cuò)誤!
電商API常見(jiàn)錯(cuò)誤排查指南:避免集成陷阱
高溫電阻率測(cè)試中的5個(gè)常見(jiàn)錯(cuò)誤及規(guī)避方法
如何驗(yàn)證CAN控制器的錯(cuò)誤響應(yīng)機(jī)制?
CY7C65215使用IOS中的USB CDC UART類驅(qū)動(dòng)程序是否可以與IOS一起工作?
在工業(yè)自動(dòng)化中使用固態(tài)繼電器時(shí)應(yīng)避免的5個(gè)錯(cuò)誤
請(qǐng)問(wèn)TapLinx IOS SDK與Xcode 16不兼容嗎?
多板 PCB 組裝中最常見(jiàn)的邏輯錯(cuò)誤
iOS使用containsObject容易犯的錯(cuò)誤
評(píng)論