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

    文章

    3400

    浏览量

    155189
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

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

    在工业自动化中使用固态继电器时应避免的5个错误

    固态继电器(SSR)已成为工业自动化的无名英雄。它们安静、可靠、速度快——这是继电器应具备的所有特点。但就像高科技驾驶舱中的新手飞行员一样,即使是经验丰富的工程师在使用SSR时也会常见错误。本文让我们来看看应如何避免在工业自动化中使用固态继电器时应避免的5个
    的头像 发表于 04-20 11:42 520次阅读

    请问TapLinx IOS SDK与Xcode 16不兼容吗?

    ]/taplinxlibrary/taplinxlibrary.swiftmodule/arm64-apple-ios.swiftmodule 清理 Build / 删除 DerivedData 目录,然后
    发表于 04-02 06:19

    IGBT IPM的错误输出功能

    本文将介绍“保护功能和工作时序”系列的第五个功能——“错误输出功能(FO)”。
    的头像 发表于 03-19 17:22 1082次阅读
    IGBT IPM的<b class='flag-5'>错误</b>输出功能

    常见xgboost错误及解决方案

    XGBoost(eXtreme Gradient Boosting)是一种流行的机器学习算法,用于解决分类和回归问题。尽管它非常强大和灵活,但在使用过程中可能会遇到一些常见的错误。以下是一些常见
    的头像 发表于 01-19 11:22 4672次阅读

    基于Vector工具进行CAN协议错误帧的分析实践

    广播发送的短帧结构,还体现在其错误检测机制上。通过总线数据以及总线波形来分析总线故障时,CAN协议错误检测机制中丰富的错误帧类型能让定位问题的效率更高。错误帧是CA
    的头像 发表于 01-15 10:03 1003次阅读
    基于Vector工具进行CAN协议<b class='flag-5'>错误</b>帧的分析实践

    电桥电路的常见错误分析

    电桥电路的常见错误分析主要包括以下几个方面: 一、电阻值不准确 电阻值不准确是电桥电路常见的错误之一。这可能是由于电阻本身的误差,如电阻的标称值与实际值存在偏差,或者电阻老化、温度变化等因素导致
    的头像 发表于 01-09 10:08 1951次阅读

    GPIO错误排查与解决

    在嵌入式系统和微控制器编程中,通用输入输出(GPIO)是最常见的接口之一。然而,在使用GPIO时,我们可能会遇到各种错误。 1. 理解GPIO GPIO是微控制器上的一组引脚,可以被配置为输入或输出
    的头像 发表于 01-09 09:46 3729次阅读

    RTOS中的错误检查机制

    在嵌入式应用中,有可能发生各种各样的错误,系统必须能够检测到这些错误并作出适当的响应。RTOS通常内置了一些错误检查功能,用于检测错误并向应用提供响应
    的头像 发表于 01-03 14:44 1025次阅读

    EEPROM编程常见错误及解决方案

    EEPROM(电可擦可编程只读存储器)在编程过程中可能会遇到多种错误。以下是一些常见的EEPROM编程错误及其解决方案: 常见错误 数据写入错误 : 在写入EEPROM时,数据可能由于
    的头像 发表于 12-16 17:08 6631次阅读

    ADS1248测温容易受干扰,导致芯片不输出激励电流,测温错误,怎么解决?

    ADS1248(四线制)测温容易受干扰,导致芯片不输出激励电流,测温错误,必须复位控制器才能重新测温,请问有没有好的解决办法
    发表于 12-13 07:31