Objective-c中 isEqual ,isEqualToString , == 三者的区别

news/2025/1/22 9:21:32

首先 OC中的对象都是用指针表示,方法的调用是基于消息机制实现,== 比较的自然是指针指向的地址

然后 说下 isEqual 和 isEqualToString 的区别

IsEqual 是 NSObject 的方法 ,而 isEqualToString 是 NSString 的方法

因此从继承关系角度来说isEqualToString 是 isEqual 的衍生方法

首先贴个苹果官方重写isEqual 的demo

  1. - (BOOL)isEqual:(id)other {  
  2.  if (other == self)   
  3.  return YES;  
  4.  if (!other || ![other isKindOfClass:[self class]])  
  5.  return NO;  
  6.  return [self isEqualToWidget:other];  
  7. }  
  8.  
  9. - (BOOL)isEqualToWidget:(MyWidget *)aWidget {  
  10.  if (self == aWidget)  
  11.  return YES;  
  12.  if (![(id)[self name] isEqual:[aWidget name]])  
  13.  return NO;  
  14.  if (![[self data] isEqualToData:[aWidget data]])  
  15.  return NO;  
  16.  return YES;  
  17. }

简单说一下:

首先都会判断 指针是否相等 ,相等直接返回YES,

不相等再判断是否是同类对象或非空,空或非同类对象直接返回NO,

而后依次判断对象对应的属性是否相等,若均相等,返回YES

这样就不难理解 isEqualToString 的实现内部的了

最后解释 HashCode 和 isEqual 的关系

hash和isEqual:方法都在NSObject协议中声明,且彼此关系紧密。实现hash方法必须返回一个整型数(NSInterger),作为哈希表结构中的表地址。

两个对象相等(isEqual:方法的判断结果)意味着它们有相同的哈希值。如果哈希值相同,两个对象不一定相等。

如果您的对象可能被包含在象NSSet这样的集合中,则需要定义hash方法,比如UIWebView

并确保该方法在两个对象相等的时候返回相同的哈希值。

 

参考测试代码:

    // 1.0NSString *str1 = [NSString stringWithFormat:@"skyming"];NSString *str2 = [NSString stringWithFormat:@"skyming"];NSLog(@"str1的地址--%p--str2的地址--%p",str1,str2);NSLog(@"== %d",str1 == str2);NSLog(@"isEqual--%d",[str1 isEqual:str2]);NSLog(@"isEqualToString--%d",[str1 isEqualToString:str2]);// 2.0UIImage *image1 = [UIImage imageNamed:str1];UIImage *image2 = [UIImage imageNamed:str2];NSLog(@"image1的地址--%p--image2的地址--%p",image1,image2);NSLog(@"== %d",image1 == image2);NSLog(@"isEqual--%d",[image1 isEqual:image2]);// 3.0UIImageView *imageView1 = [[UIImageView alloc]initWithImage:image1];UIImageView *imageView2 = [[UIImageView alloc]initWithImage:image2];NSLog(@"imageView1地址--%p-imageView2地址--%p",imageView1,imageView2);NSLog(@"== %d",imageView1 == imageView2);NSLog(@"isEqual--%d",[imageView1 isEqual:imageView2]);}


参考测试结果:

2013-12-21 21:36:38.975 NSString[2029:60b] str1的地址--0x15586d00--str2的地址--0x15586a40
2013-12-21 21:36:38.982 NSString[2029:60b] == 0
2013-12-21 21:36:38.988 NSString[2029:60b] isEqual--1
2013-12-21 21:36:38.992 NSString[2029:60b] isEqualToString--1
2013-12-21 21:36:39.004 NSString[2029:60b] image1的地址--0x1558ad00--image2的地址--0x1558ad00
2013-12-21 21:36:39.009 NSString[2029:60b] == 1
2013-12-21 21:36:39.013 NSString[2029:60b] isEqual--1
2013-12-21 21:36:39.017 NSString[2029:60b] imageView1地址--0x1558b0f0-imageView2地址--0x1558ba50
2013-12-21 21:36:39.022 NSString[2029:60b] == 0
2013-12-21 21:36:39.026 NSString[2029:60b] isEqual--0


参考资料:

http://mobile.51cto.com/iphone-280494.htm

http://stackoverflow.com/questions/1112373/implementing-hash-isequal-isequalto-for-objective-c-collections?rq=1

 

转:http://www.cnblogs.com/skyming/p/3485605.html

 

转载于:https://www.cnblogs.com/ygm900/p/4633965.html

文章来源:https://blog.csdn.net/weixin_30905133/article/details/99753897
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-17231.html

相关文章

UIView详解

来源:http://blog.csdn.net/chengyingzhilian/article/details/7894276 UIView表示屏幕上的一块矩形区域,它在App中占有绝对重要的地位,因为IOS中几乎所有可视化控件都是UIView的子类。负责渲染区域的内容,并且响应该区域内发生的…

jmeter基础入门(HTTP,TCP,SQL查询,新增,查看报告)

示例下载地址 https://download.csdn.net/download/qq_41712271/20398149有坑的地方 1 发送TCP请求,注意Tcp client classname,如下图,这里发送16进制,所以写 BinaryTCPClientImpl TCPClientImpl:纯文本为内容进行发送 BinaryT…

编写高质量的Objective-C代码

点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法。良好的风格:view.backgroundColor [UIColor orangeColor];[UIApplication sharedApplication].delegate;不良的…

向上取整

(a(b-1))/b 34 / 11 (34 % 11 ! 0 ? 1 : 0) CUDA计算中,可以采用这两种方式来表示向上取整。转载于:https://www.cnblogs.com/liangliangdetianxia/p/3985002.html

Jmeter非GUI界面,执行测试脚本,本地运行,远程集群方式运行,生成测试报告等

测试脚本地址jmeter基础入门(HTTP,TCP,SQL查询,新增,查看报告).rar-其它文档类资源-CSDN下载Jmeter非GUI界面,执行测试脚本,命令参数讲解 -h 帮助 -n 非GUI模式 -t 指定要运行的 JMeter 测试脚本文…

Excel 2007中自定义数字格式前要了解的准则

要在Excel 2007中创建自定义数字格式,首先应了解自定义数字格式的准则,并从选择某一内置数字格式开始。然后,可以更改该格式的任意代码部分,从而创建自己的自定义数字格式。 数字格式最多可包含四个代码部分,各个部分用…

oracle 删除掉重复数据只保留一条

用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId fr…

这么方便吗?用ChatGPT生成Excel(详解步骤)

文章目录前言使用过 ChatGPT 的人都知道,提示占据非常重要的位置。而 Word,Excel、PPT 这办公三大件中,当属 Excel 最难搞,想要熟练掌握它,需要记住很多公式。但是使用提示就简单多了,和 ChatGPT 聊聊天就能…

jenkins持续集成入门1

jenkins持续集成相关的软件安装分布架构图 软件安装的列表如下: jdk8或以上 maven git GitLab-EE Docker Harbor (docker私服) jenkins SonarQube (代码审查) Tomcat

HTML5新增Canvas标签及对应属性、API详解(基础一)

知识说明: HTML5新增的canvas标签,通过创建画布,在画布上创建任何想要的形状,下面将canvas的API以及属性做一个整理,并且附上时钟的示例,便于后期复习学习!Fighting! 一、标签原型 &…