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

    文章

    3401

    浏览量

    155672
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27461
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    信号完整性仿真中容易的几个错误

    说出来你可能不信,很多工程师拿着漂亮的仿真报告,实物一测试,问题全出来了。返工、延期、挨骂,样样都逃不掉。
    的头像 发表于 04-20 10:17 488次阅读
    信号完整性仿真中<b class='flag-5'>容易</b><b class='flag-5'>犯</b>的几个<b class='flag-5'>错误</b>

    NXP产品标记错误信息通知解读

    NXP产品标记错误信息通知解读 在电子行业,产品的质量和准确性至关重要。近日,NXP向购买其产品的客户发出了一份质量信息通知,涉及产品ASC8850AET和ASC8852AET的标记错误问题。下面
    的头像 发表于 04-08 16:30 121次阅读

    CAN总线报错看不懂?5种错误帧+5步排查法一次讲清

    CAN总线通信异常?错误帧频繁出现?本文详解五种错误帧类型,并提供五步排查法,助你快速定位问题根源。错误帧的作用错误帧是CAN总线用于错误
    的头像 发表于 03-16 11:36 376次阅读
    CAN总线报错看不懂?5种<b class='flag-5'>错误</b>帧+5步排查法一次讲清

    瀚海微SD NAND/TF卡数据损坏与校验错误(含CRC错误、数据比对失败)问题解析

    数据损坏与校验错误是瀚海微SD NAND/TF卡在数据存储与传输过程中的关键故障,除常见的CRC错误外,数据比对失败(读取数据与写入数据不一致)是核心表现形式,直接影响数据准确性,在工业控制、高清存储等场景中可能引发严重后果。以下从故障表现、成因及解决方案展开详细说明。
    的头像 发表于 11-30 15:15 1118次阅读

    Cortex-M0+处理器的HardFault错误介绍

    在ARM处理器中,如果一个程序产生了错误并且被处理器检测到,就会产生错误异常。Cortex-M0+处理器只有一种异常用以处理错误:HardFault。
    的头像 发表于 10-14 10:50 3644次阅读
    Cortex-M0+处理器的HardFault<b class='flag-5'>错误</b>介绍

    分析负载特性时,有哪些常见的错误或误区?

    分析负载特性时,很多人会因 “想当然套用经验”“忽略实际场景细节” 或 “混淆概念” 导致判断偏差,进而让报警阈值调整失效(如误报、漏报)。以下是 6 个最常见的错误 / 误区,附错误表现、危害
    的头像 发表于 10-10 17:03 1082次阅读

    如何解决I/O时钟布局器错误

    在 I/O 时钟布局器阶段可能会发生错误,指出该工具无法对该时钟结构进行布局,直至最后 BUFG 仍然无法完成布局。
    的头像 发表于 09-23 16:05 1287次阅读

    知晓常见的铜缆安装错误并避免

    铜缆(如网线、电话线等)是网络和数据传输的基础设施,但在安装过程中,由于操作不当或忽视细节,常出现各种错误,导致网络性能下降甚至故障。以下是常见的铜缆安装错误及预防措施,帮助您避免踩坑: 一、线缆
    的头像 发表于 09-16 10:42 1275次阅读

    步进电机EMC整改:不过关?常见误区你可能正在

    深圳南柯电子|步进电机EMC整改:不过关?常见误区你可能正在
    的头像 发表于 09-08 09:58 815次阅读

    国巨贴片电容的电压标识有哪些常见错误

    国巨贴片电容的电压标识在识别和使用过程中可能存在一些常见错误,这些错误可能源于标识本身的模糊性、不同系列产品的差异、对标识规则的误解,或使用环境的影响。以下是具体分析: 一、标识模糊或缺失导致的错误
    的头像 发表于 08-28 16:51 928次阅读

    避雷!树莓派初学者常犯的5个错误

    如果你刚刚入手树莓派,你就会知道它潜力无穷,几乎能实现你想到的任何功能。然而,这种自由也让你可能在不知不觉中做出对系统有害的操作。在本文中,我将介绍要避免哪些错误。初学者最常犯的错误包括:损坏SD
    的头像 发表于 07-22 17:16 1562次阅读
    避雷!树莓派初学者常犯的5个<b class='flag-5'>错误</b>!

    电商API常见错误排查指南:避免集成陷阱

      在电商平台开发中,API集成是连接系统、实现数据交换的核心环节。然而,许多开发者在集成过程中常遇到错误,导致项目延迟、数据丢失或用户体验下降。本文将逐步介绍常见错误类型、排查方法以及预防策略
    的头像 发表于 07-11 14:21 2293次阅读
    电商API常见<b class='flag-5'>错误</b>排查指南:避免集成陷阱

    高温电阻率测试中的5个常见错误及规避方法

    在材料科学与工业检测领域,高温电阻率测试是评估材料导电性能的关键手段,如同颠转仪在材料性能检测中发挥重要作用一样,其测试结果的准确性直接影响科研结论与生产决策。然而,实际操作中,诸多细节问题容易导致
    的头像 发表于 06-09 13:07 1039次阅读
    高温电阻率测试中的5个常见<b class='flag-5'>错误</b>及规避方法

    如何验证CAN控制器的错误响应机制?

    CAN节点的稳定性、可靠性和安全性得益于其强大的错误管理机制。上一篇文章我们介绍了CAN控制器的错误管理机制的工作原理。本文将基于其工作原理及ISO16845-1:2016标准,为大家介绍
    的头像 发表于 04-30 18:24 1017次阅读
    如何验证CAN控制器的<b class='flag-5'>错误</b>响应机制?

    CY7C65215使用IOS中的USB CDC UART类驱动程序是否可以与IOS一起工作?

    我知道 CY7C65215 没有适用于 IOS 的驱动程序。但是,使用 IOS 中的 USB CDC UART 类驱动程序是否可以与 IOS 一起工作? 我们正在考虑在我们的设备中安装 CY7C65215 而不是 FTDI US
    发表于 04-30 07:57