chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

iOS使用containsObject容易犯的錯誤

454398 ? 來源:it610 ? 作者:充電實踐 ? 2020-11-11 16:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

項目開發(fā)過程中可能會有這種需求,某個可變數(shù)組不斷地增加元素,同時我們需要判斷新的元素是否已經(jīng)在數(shù)組里,如果不在才添加該元素,否則丟棄。

基于以上的需求,很容易想到使用NSArray的containsObject方法。我們先來看看官方的介紹:

- (BOOL)containsObject:(ObjectType)anObject

Parameters

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.

對于普通的NSObject比較用isEqual:方法比較hash,而對于對于自己定義的類,直接使用containsObject會一直返回NO,原因是containsObject比較的是數(shù)組里的兩個對象,其hash值必然不一樣。比如以下自定義類:

@interface Person

@property NSString *name;

@property NSInteger age;

@end

@implementation Person

@end

Person中包含name和age,分別表示名字和年齡,數(shù)組中包含多個Person,我們的目的是,如果數(shù)組中存在同樣的人名,并且年齡完全相同,就舍棄新的Person,如何實現(xiàn)這個需求呢?我們需要重載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];

}

通過重載后,containsObject方法就能完美實現(xiàn)我們想要的功能。那么問題來了,像以下代碼,會存在什么問題?

NSMutableArrray *personArray = [[NSMutableArray alloc] init] ;

...

在某個controller中初始化了數(shù)組,該controller注冊了某個通知,有其他類每隔一定時間發(fā)送通知給controller,通知里包含person對象。當(dāng)前controller收到通知后,通過containObject方法過濾重復(fù)的person,然后保存到personArray 中。

通知的處理函數(shù)如下:

-(void)didReceiveNotification:(id)sender

{

...

Person *newPerson = [[sender userInfo] objectFor:@"person" ];//此處取出通知中的person對象

...(做一些其他運算)

if(![personArray containsObject:newPerson ])

{

[personArray addObject:newPerson];

}

}
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • iOS
    iOS
    +關(guān)注

    關(guān)注

    8

    文章

    3400

    瀏覽量

    154649
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    420

    瀏覽量

    27017
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    步進(jìn)電機(jī)EMC整改:不過關(guān)?常見誤區(qū)你可能正在

    深圳南柯電子|步進(jìn)電機(jī)EMC整改:不過關(guān)?常見誤區(qū)你可能正在
    的頭像 發(fā)表于 09-08 09:58 ?331次閱讀

    避雷!樹莓派初學(xué)者常犯的5個錯誤

    如果你剛剛?cè)胧謽漭?,你就會知道它潛力無窮,幾乎能實現(xiàn)你想到的任何功能。然而,這種自由也讓你可能在不知不覺中做出對系統(tǒng)有害的操作。在本文中,我將介紹要避免哪些錯誤。初學(xué)者最常犯的錯誤包括:損壞SD
    的頭像 發(fā)表于 07-22 17:16 ?505次閱讀
    避雷!樹莓派初學(xué)者常犯的5個<b class='flag-5'>錯誤</b>!

    CY7C65215使用IOS中的USB CDC UART類驅(qū)動程序是否可以與IOS一起工作?

    我知道 CY7C65215 沒有適用于 IOS 的驅(qū)動程序。但是,使用 IOS 中的 USB CDC UART 類驅(qū)動程序是否可以與 IOS 一起工作? 我們正在考慮在我們的設(shè)備中安裝 CY7C65215 而不是 FTDI US
    發(fā)表于 04-30 07:57

    在工業(yè)自動化中使用固態(tài)繼電器時應(yīng)避免的5個錯誤

    固態(tài)繼電器(SSR)已成為工業(yè)自動化的無名英雄。它們安靜、可靠、速度快——這是繼電器應(yīng)具備的所有特點。但就像高科技駕駛艙中的新手飛行員一樣,即使是經(jīng)驗豐富的工程師在使用SSR時也會常見錯誤。本文讓我們來看看應(yīng)如何避免在工業(yè)自動化中使用固態(tài)繼電器時應(yīng)避免的5個
    的頭像 發(fā)表于 04-20 11:42 ?425次閱讀

    請問TapLinx IOS SDK與Xcode 16不兼容嗎?

    ]/taplinxlibrary/taplinxlibrary.swiftmodule/arm64-apple-ios.swiftmodule 清理 Build / 刪除 DerivedData 目錄,然后
    發(fā)表于 04-02 06:19

    常見xgboost錯誤及解決方案

    XGBoost(eXtreme Gradient Boosting)是一種流行的機(jī)器學(xué)習(xí)算法,用于解決分類和回歸問題。盡管它非常強(qiáng)大和靈活,但在使用過程中可能會遇到一些常見的錯誤。以下是一些常見
    的頭像 發(fā)表于 01-19 11:22 ?4306次閱讀

    GPIO錯誤排查與解決

    在嵌入式系統(tǒng)和微控制器編程中,通用輸入輸出(GPIO)是最常見的接口之一。然而,在使用GPIO時,我們可能會遇到各種錯誤。 1. 理解GPIO GPIO是微控制器上的一組引腳,可以被配置為輸入或輸出
    的頭像 發(fā)表于 01-09 09:46 ?3298次閱讀

    RTOS中的錯誤檢查機(jī)制

    在嵌入式應(yīng)用中,有可能發(fā)生各種各樣的錯誤,系統(tǒng)必須能夠檢測到這些錯誤并作出適當(dāng)?shù)捻憫?yīng)。RTOS通常內(nèi)置了一些錯誤檢查功能,用于檢測錯誤并向應(yīng)用提供響應(yīng)
    的頭像 發(fā)表于 01-03 14:44 ?924次閱讀

    EEPROM編程常見錯誤及解決方案

    EEPROM(電可擦可編程只讀存儲器)在編程過程中可能會遇到多種錯誤。以下是一些常見的EEPROM編程錯誤及其解決方案: 常見錯誤 數(shù)據(jù)寫入錯誤 : 在寫入EEPROM時,數(shù)據(jù)可能由于
    的頭像 發(fā)表于 12-16 17:08 ?6034次閱讀

    ADS1248測溫容易受干擾,導(dǎo)致芯片不輸出激勵電流,測溫錯誤,怎么解決?

    ADS1248(四線制)測溫容易受干擾,導(dǎo)致芯片不輸出激勵電流,測溫錯誤,必須復(fù)位控制器才能重新測溫,請問有沒有好的解決辦法
    發(fā)表于 12-13 07:31

    如何修正初學(xué)者使用加熱臺時最容易錯誤,內(nèi)含新品偷跑【MINIWARE】

    行業(yè)資訊
    易迪賽智能科技
    發(fā)布于 :2024年11月27日 14:13:37

    SQL錯誤代碼及解決方案

    在SQL數(shù)據(jù)庫開發(fā)和管理中,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但通常會在錯誤消息中明確指出是語法
    的頭像 發(fā)表于 11-19 10:21 ?9659次閱讀

    C++新手容易的十個編程錯誤

    簡單的總結(jié)一下?C++ 新手容易的一些編程錯誤,給新人們提供一個參考。 1 有些關(guān)鍵字在 cpp 文件中多寫了 對于 C++ 類,一些關(guān)鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如
    的頭像 發(fā)表于 11-15 12:42 ?1248次閱讀

    pcb板設(shè)計中的常見錯誤

    印刷電路板(PCB)是電子設(shè)備中不可或缺的組成部分,它負(fù)責(zé)連接電子元件并傳輸電信號。一個優(yōu)秀的PCB設(shè)計對于確保電路的性能、可靠性和成本效益至關(guān)重要。然而,在PCB設(shè)計過程中,工程師可能會一些常見
    的頭像 發(fā)表于 11-04 13:58 ?1243次閱讀

    socket編程中的錯誤處理技巧

    Socket編程是網(wǎng)絡(luò)編程的基礎(chǔ),它允許程序之間通過TCP/IP協(xié)議進(jìn)行通信。然而,網(wǎng)絡(luò)通信是不穩(wěn)定的,可能會遇到各種問題,如網(wǎng)絡(luò)延遲、連接中斷、數(shù)據(jù)丟失等。 錯誤處理的重要性 提高程序的健壯性
    的頭像 發(fā)表于 11-01 17:47 ?1889次閱讀