精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

iOS使用containsObject容易犯的錯誤

454398 ? 來源:it610 ? 作者:充電實踐 ? 2020-11-11 16:30 ? 次閱讀

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

基于以上的需求,很容易想到使用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比較的是數組里的兩個對象,其hash值必然不一樣。比如以下自定義類:

@interface Person

@property NSString *name;

@property NSInteger age;

@end

@implementation Person

@end

Person中包含name和age,分別表示名字和年齡,數組中包含多個Person,我們的目的是,如果數組中存在同樣的人名,并且年齡完全相同,就舍棄新的Person,如何實現這個需求呢?我們需要重載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方法就能完美實現我們想要的功能。那么問題來了,像以下代碼,會存在什么問題?

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

...

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

通知的處理函數如下:

-(void)didReceiveNotification:(id)sender

{

...

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

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

if(![personArray containsObject:newPerson ])

{

[personArray addObject:newPerson];

}

}
編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • iOS
    iOS
    +關注

    關注

    8

    文章

    3393

    瀏覽量

    150445
  • 數組
    +關注

    關注

    1

    文章

    415

    瀏覽量

    25908
收藏 人收藏

    評論

    相關推薦

    SQL錯誤代碼及解決方案

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

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

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

    pcb板設計中的常見錯誤

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

    蘋果推出iOS 17.6.1升級版,修復重要錯誤內容

    8月20日資訊,蘋果并未如預期推出iOS 17.6.2更新,而是意外地重新發布了iOS 17.6.1的升級版,新版本編號為21G101,這一編號標志著較之前發布的21G93版本有所升級。此次重發旨在解決一系列關鍵問題,并特別強調了重要
    的頭像 發表于 08-21 15:31 ?880次閱讀

    IOS12以上搜索不到藍牙是怎么回事?

    現在是這樣的,IOS12以下測試能夠搜索到設備藍牙。但是IOS12以上就都搜索不到。 是什么原因呢?
    發表于 07-02 08:03

    配對過IOS13.5的手機無法連接刪除綁定信息的esp32藍牙,怎么解決?

    你好,我的IDF版本是4.1,手機是IOS13.5版本的,APP是nRF Connect。 當IOS手機配對連接esp32藍牙成功后,把esp32本地存儲的藍牙綁定信息刪除掉,IOS手機就沒辦法再次
    發表于 06-25 07:56

    一文讀懂CAN通訊錯誤

    CAN總線通信技術廣泛應用于多個行業,是每個總線設計工程師必學的一個通訊網絡。然而,對于CAN通信中的錯誤幀,許多人僅停留在表面了解,缺乏深入理解,這導致許多工程師在面對總線通信故障時感到無從下手
    的頭像 發表于 06-12 08:24 ?2545次閱讀
    一文讀懂CAN通訊<b class='flag-5'>錯誤</b>幀

    一文讀懂CAN控制器錯誤處理的原理

    CAN通訊的錯誤幀到底是如何被界定的?本文帶你輕松了解!錯誤標定檢測到錯誤條件的站通過發送錯誤標志指示錯誤。對于“
    的頭像 發表于 04-26 08:25 ?1534次閱讀
    一文讀懂CAN控制器<b class='flag-5'>錯誤</b>處理的原理

    蘋果發布iOS/iPadOS 17.4.1修復版,修復未知錯誤

    蘋果在官方更新記錄中聲稱,此更新針對重大錯誤修復及安全問題作了改進,強烈建議廣大用戶予以安裝。盡管蘋果公司并未披露具體修正了何種差錯,但其官方支持網站暫無更新服務。IT之家會持續追蹤相關動態,對此進行后續報道。
    的頭像 發表于 03-27 15:48 ?1412次閱讀

    PCB設計工作中常見的錯誤有哪些?

    設計PCB的過程中,很多人都會一些常見的錯誤,這些錯誤如果不能及時糾正,就會極大地影響產品質量。本文將針對 PCB 設計過程中經常會的這些錯誤
    的頭像 發表于 02-21 09:32 ?520次閱讀
    PCB設計工作中常見的<b class='flag-5'>錯誤</b>有哪些?

    CMOS設置錯誤的解決方法

    CMOS設置錯誤的解決方法? CMOS是計算機中的一塊電路,用于存儲電腦的基本配置信息。如果設置錯誤,可能會導致計算機無法正常啟動或運行,因此需要盡早解決。本文將為你詳細介紹如何解決CMOS設置錯誤
    的頭像 發表于 12-28 15:13 ?7924次閱讀

    ug內部錯誤,內存訪問違例怎么解決

    ug內部錯誤,內存訪問違例怎么解決 內部錯誤和內存訪問違例是編程中常見的問題,它們可能會導致應用程序崩潰、數據丟失或系統不穩定。在本文中,我將詳細解釋內部錯誤和內存訪問違例的原因,如何解決這些
    的頭像 發表于 12-27 16:27 ?6072次閱讀

    蘋果關閉iOS 17.1.1和17.1.2驗證通道,鼓勵用戶升級至17.2.1

    據 IT之家,現今用戶可以選擇升級至iOS 17.2.1。該版本修復了許多未明確指出的錯誤;之前的版本iOS 17.2新增了全新筆記應用、針對iPhone 15 Pro系列手機的空間音頻錄制功能
    的頭像 發表于 12-20 10:22 ?2245次閱讀

    vlookup常見的12種錯誤

    VLOOKUP是Excel中非常常用的函數之一,它能夠根據指定的值,在某一列范圍內進行查找,并返回相應的值。雖然VLOOKUP是一個強大的函數,但是由于其復雜性和靈活性,常常容易出現一些錯誤。在本文
    的頭像 發表于 12-01 11:19 ?3114次閱讀

    腳本錯誤scripterror怎么解決

    “腳本錯誤”(Script Error)通常是在運行或嘗試運行一段腳本或程序時出現的錯誤。這種錯誤可能源于許多不同的原因,包括語法錯誤、運行環境問題、依賴庫缺失等。解決腳本
    的頭像 發表于 11-26 14:46 ?8054次閱讀