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

    文章

    3327

    浏览量

    149211
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25612
收藏 人收藏

    评论

    相关推荐

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

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

    盘点PCB设计中的常见错误

    搞技术,难免存在错误,只有经历过错误,才能更快地成长。PCB设计也一样,今天就来盘点一下PCB设计中最常见的错误
    的头像 发表于 01-12 09:53 763次阅读
    盘点PCB设计中的常见<b class='flag-5'>错误</b>

    苹果关闭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 1573次阅读

    vlookup常见的12种错误

    VLOOKUP是Excel中非常常用的函数之一,它能够根据指定的值,在某一列范围内进行查找,并返回相应的值。虽然VLOOKUP是一个强大的函数,但是由于其复杂性和灵活性,常常容易出现一些错误。在本文
    的头像 发表于 12-01 11:19 1738次阅读

    脚本错误scripterror怎么解决

    “脚本错误”(Script Error)通常是在运行或尝试运行一段脚本或程序时出现的错误。这种错误可能源于许多不同的原因,包括语法错误、运行环境问题、依赖库缺失等。解决脚本
    的头像 发表于 11-26 14:46 3270次阅读

    c语言代码错误怎么找

    当我们编写C语言代码时,常常会遇到一些错误。这些错误可能是语法错误,逻辑错误或者是运行时错误。无论是什么类型的
    的头像 发表于 11-24 10:05 1510次阅读

    哪些错误PLC新手容易犯?

    PLC新手在使用和编程PLC时容易犯以下一些常见错误: (1)电气接线错误:PLC的输入和输出需要正确地与外部设备进行连接。新手可能会犯接线错误,例如接错线圈端子、断开或短路电线等。这
    的头像 发表于 10-11 17:10 435次阅读

    认识CAN总线错误 CAN总线错误分析与解决

    认识CAN 总线错误的第一步就是了解认识CAN 总线协议和它的具体功能,这样才能更容易地理解CAN 总线是如何去发现并解决错误的。
    发表于 08-14 15:18 3720次阅读
    认识CAN总线<b class='flag-5'>错误</b> CAN总线<b class='flag-5'>错误</b>分析与解决

    #硬声创作季 电子知识 容易错误

    电子知识
    Mr_haohao
    发布于 :2023年07月25日 08:18:52

    嵌入式C开发中段错误的3种调试方法

    相信大家在嵌入式C开发中,或多或少都会遇到段错误(segmentation fault )。昨天分享了一个总线错误的例子:嵌入式软件中,关于总线错误,我帮你们踩了这些坑!相比总线错误
    发表于 07-11 09:42 147次阅读
    嵌入式C开发中段<b class='flag-5'>错误</b>的3种调试方法

    新手layout布局最容易放的错误

    问一下,我觉得自动布线挺好用的啊,只要布局好了,规则设置好了,很快就能生成图。为什么都说自动布线不好。
    发表于 07-04 09:29 301次阅读
    新手layout布局最<b class='flag-5'>容易</b>放的<b class='flag-5'>错误</b>

    详解常用的CAN总线(下):错误

    错误帧种类分为5种,分别是:位发送错误、ACK错误、位填充错误、CRC错误、格式错误
    发表于 06-19 17:25 2796次阅读
    详解常用的CAN总线(下):<b class='flag-5'>错误</b>帧

    C程序中常见的与内存相关的错误

    对C语言入门程序员来说,管理和使用虚拟存储器可能是个困难的,容易出错的任务。与存储器有关的错误属于那些最令人惊恐的错误,因为它们经常在时间和空间上,都在距错误源一段距离之后,才表现出来
    发表于 06-14 17:13 267次阅读
    C程序中常见的与内存相关的<b class='flag-5'>错误</b>

    PCB设计最容易出现的错误有哪些?

    放置在铜上的参考标记会出现在 PCB 布局软件中,但不会出现在物理 PCB 上。如果您的参考指示符放置在布局中的焊盘上,那么当您拿到 PCB 时它们就会丢失,并且放置元件会很困难。
    发表于 06-02 09:10 332次阅读
    PCB设计最<b class='flag-5'>容易</b>出现的<b class='flag-5'>错误</b>有哪些?

    iOS网页设计的关键考虑因素是什么?

    iOS 设计时最重要的细节是确保网站响应迅速并针对移动设备进行优化,注意用户界面和导航,结合 iOS 特定功能,并在不同的 iOS 设备和版本之间进行全面测试。
    发表于 05-25 07:24