91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

iOS使用containsObject容易犯的錯誤

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

掃碼添加小助手

加入工程師交流群

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

基于以上的需求,很容易想到使用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,如何實現(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中初始化了數組,該controller注冊了某個通知,有其他類每隔一定時間發(fā)送通知給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

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

    關注

    8

    文章

    3401

    瀏覽量

    155518
  • 數組
    +關注

    關注

    1

    文章

    420

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    瀚海微SD NAND/TF卡數據損壞與校驗錯誤(含CRC錯誤、數據比對失?。﹩栴}解析

    數據損壞與校驗錯誤是瀚海微SD NAND/TF卡在數據存儲與傳輸過程中的關鍵故障,除常見的CRC錯誤外,數據比對失?。ㄗx取數據與寫入數據不一致)是核心表現(xiàn)形式,直接影響數據準確性,在工業(yè)控制、高清存儲等場景中可能引發(fā)嚴重后果。以下從故障表現(xiàn)、成因及解決方案展開詳細說明。
    的頭像 發(fā)表于 11-30 15:15 ?843次閱讀

    Cortex-M0+處理器的HardFault錯誤介紹

    在ARM處理器中,如果一個程序產生了錯誤并且被處理器檢測到,就會產生錯誤異常。Cortex-M0+處理器只有一種異常用以處理錯誤:HardFault。
    的頭像 發(fā)表于 10-14 10:50 ?3402次閱讀
    Cortex-M0+處理器的HardFault<b class='flag-5'>錯誤</b>介紹

    分析負載特性時,有哪些常見的錯誤或誤區(qū)?

    分析負載特性時,很多人會因 “想當然套用經驗”“忽略實際場景細節(jié)” 或 “混淆概念” 導致判斷偏差,進而讓報警閾值調整失效(如誤報、漏報)。以下是 6 個最常見的錯誤 / 誤區(qū),附錯誤表現(xiàn)、危害
    的頭像 發(fā)表于 10-10 17:03 ?834次閱讀

    如何解決I/O時鐘布局器錯誤

    在 I/O 時鐘布局器階段可能會發(fā)生錯誤,指出該工具無法對該時鐘結構進行布局,直至最后 BUFG 仍然無法完成布局。
    的頭像 發(fā)表于 09-23 16:05 ?1077次閱讀

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

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

    國巨貼片電容的電壓標識有哪些常見錯誤?

    國巨貼片電容的電壓標識在識別和使用過程中可能存在一些常見錯誤,這些錯誤可能源于標識本身的模糊性、不同系列產品的差異、對標識規(guī)則的誤解,或使用環(huán)境的影響。以下是具體分析: 一、標識模糊或缺失導致的錯誤
    的頭像 發(fā)表于 08-28 16:51 ?768次閱讀

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

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

    電商API常見錯誤排查指南:避免集成陷阱

    ? 在電商平臺開發(fā)中,API集成是連接系統(tǒng)、實現(xiàn)數據交換的核心環(huán)節(jié)。然而,許多開發(fā)者在集成過程中常遇到錯誤,導致項目延遲、數據丟失或用戶體驗下降。本文將逐步介紹常見錯誤類型、排查方法以及預防策略
    的頭像 發(fā)表于 07-11 14:21 ?2069次閱讀
    電商API常見<b class='flag-5'>錯誤</b>排查指南:避免集成陷阱

    高溫電阻率測試中的5個常見錯誤及規(guī)避方法

    在材料科學與工業(yè)檢測領域,高溫電阻率測試是評估材料導電性能的關鍵手段,如同顛轉儀在材料性能檢測中發(fā)揮重要作用一樣,其測試結果的準確性直接影響科研結論與生產決策。然而,實際操作中,諸多細節(jié)問題容易導致
    的頭像 發(fā)表于 06-09 13:07 ?904次閱讀
    高溫電阻率測試中的5個常見<b class='flag-5'>錯誤</b>及規(guī)避方法

    如何驗證CAN控制器的錯誤響應機制?

    CAN節(jié)點的穩(wěn)定性、可靠性和安全性得益于其強大的錯誤管理機制。上一篇文章我們介紹了CAN控制器的錯誤管理機制的工作原理。本文將基于其工作原理及ISO16845-1:2016標準,為大家介紹
    的頭像 發(fā)表于 04-30 18:24 ?882次閱讀
    如何驗證CAN控制器的<b class='flag-5'>錯誤</b>響應機制?

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

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

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

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

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

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

    IGBT IPM的錯誤輸出功能

    本文將介紹“保護功能和工作時序”系列的第五個功能——“錯誤輸出功能(FO)”。
    的頭像 發(fā)表于 03-19 17:22 ?1328次閱讀
    IGBT IPM的<b class='flag-5'>錯誤</b>輸出功能

    多板 PCB 組裝中最常見的邏輯錯誤

    許多電子系統(tǒng)和產品并不只使用1個PCB,而是可能包含多個電路板、單個電路板和多個外部模塊,或者通過電纜與外部設備連接。在多板系統(tǒng)中,兩個電路板之間可能會出現(xiàn)邏輯錯誤,但如果沒有全面審查設計,可能
    的頭像 發(fā)表于 03-14 18:15 ?930次閱讀
    多板 PCB 組裝中最常見的邏輯<b class='flag-5'>錯誤</b>