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

    文章

    3395

    浏览量

    150566
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25939
收藏 人收藏

    评论

    相关推荐

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

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

    如何修正初学者使用加热台时最容易错误,内含新品偷跑【MINIWARE】

    行业资讯
    易迪赛智能科技
    发布于 :2024年11月27日 14:13:37

    SQL错误代码及解决方案

    在SQL数据库开发和管理中,常见的错误代码及其解决方案可以归纳如下: 一、语法错误(Syntax Errors) 错误代码 :无特定代码,但通常会在错误消息中明确指出是语法
    的头像 发表于 11-19 10:21 1351次阅读

    C++新手容易的十个编程错误

    简单的总结一下 C++ 新手容易的一些编程错误,给新人们提供一个参考。 1 有些关键字在 cpp 文件中多写了 对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再加上了,比如
    的头像 发表于 11-15 12:42 312次阅读

    pcb板设计中的常见错误

    印刷电路板(PCB)是电子设备中不可或缺的组成部分,它负责连接电子元件并传输电信号。一个优秀的PCB设计对于确保电路的性能、可靠性和成本效益至关重要。然而,在PCB设计过程中,工程师可能会一些常见
    的头像 发表于 11-04 13:58 240次阅读

    网关错误是什么意思

    网关错误是计算机网络中一个常见且复杂的问题,它通常发生在客户端和服务器之间的通信过程中,导致客户端的请求无法被正确处理或响应。为了全面理解网关错误,本文将从其定义、原因、类型、影响、诊断方法以及解决方案等多个方面进行详细阐述。
    的头像 发表于 09-30 11:40 2968次阅读

    苹果推出iOS 17.6.1升级版,修复重要错误内容

    8月20日资讯,苹果并未如预期推出iOS 17.6.2更新,而是意外地重新发布了iOS 17.6.1的升级版,新版本编号为21G101,这一编号标志着较之前发布的21G93版本有所升级。此次重发旨在解决一系列关键问题,并特别强调了重要
    的头像 发表于 08-21 15:31 930次阅读

    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 2683次阅读
    一文读懂CAN通讯<b class='flag-5'>错误</b>帧

    一文读懂CAN控制器错误处理的原理

    CAN通讯的错误帧到底是如何被界定的?本文带你轻松了解!错误标定检测到错误条件的站通过发送错误标志指示错误。对于“
    的头像 发表于 04-26 08:25 1606次阅读
    一文读懂CAN控制器<b class='flag-5'>错误</b>处理的原理

    苹果发布iOS/iPadOS 17.4.1修复版,修复未知错误

    苹果在官方更新记录中声称,此更新针对重大错误修复及安全问题作了改进,强烈建议广大用户予以安装。尽管苹果公司并未披露具体修正了何种差错,但其官方支持网站暂无更新服务。IT之家会持续追踪相关动态,对此进行后续报道。
    的头像 发表于 03-27 15:48 1437次阅读

    PCB设计工作中常见的错误有哪些?

    设计PCB的过程中,很多人都会一些常见的错误,这些错误如果不能及时纠正,就会极大地影响产品质量。本文将针对 PCB 设计过程中经常会的这些错误
    的头像 发表于 02-21 09:32 556次阅读
    PCB设计工作中常见的<b class='flag-5'>错误</b>有哪些?

    CMOS设置错误的解决方法

    CMOS设置错误的解决方法  CMOS是计算机中的一块电路,用于存储电脑的基本配置信息。如果设置错误,可能会导致计算机无法正常启动或运行,因此需要尽早解决。本文将为你详细介绍如何解决CMOS设置错误
    的头像 发表于 12-28 15:13 8354次阅读

    ug内部错误,内存访问违例怎么解决

    ug内部错误,内存访问违例怎么解决 内部错误和内存访问违例是编程中常见的问题,它们可能会导致应用程序崩溃、数据丢失或系统不稳定。在本文中,我将详细解释内部错误和内存访问违例的原因,如何解决这些
    的头像 发表于 12-27 16:27 6267次阅读