首先 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. - (BOOL)isEqualToWidget:(MyWidget *)aWidget {
  9. if (self == aWidget)
  10. return YES;
  11. if (![(id)[self name] isEqual:[aWidget name]])
  12. return NO;
  13. if (![[self data] isEqualToData:[aWidget data]])
  14. return NO;
  15. return YES;
  16. }

简单说一下:

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

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

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

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

最后解释 HashCode 和 isEqual 的关系

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

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

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

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

参考测试代码:

    // 1.0
NSString *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.0
UIImage *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.0
UIImageView *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

Objective-c中 isEqual ,isEqualToString , == 三者的区别的更多相关文章

  1. isEqual,isEqualTostring,==三者的区别

    isEqual:首先判断两个字对象的类型是否相同,在判断内容是否相同,如果类型不同直接return no.如先判断是否都是 NSString,在判断string的内容. isEqualTostring ...

  2. 在Java中>、>>、>>>三者的区别

    Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力 ...

  3. Objective C中nil/Nil/NULL的区别

    nil:指向oc中对象的空指针 Nil:指向oc中类的空指针 NULL:指向其他类型的空指针,如一个c类型的内存指针 NSNull:在集合对象中,表示空值的对象 若obj为nil:[obj messa ...

  4. android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别

    android Activity类中的finish().onDestory()和System.exit(0) 三者的区别 Activity.finish() Call this when your a ...

  5. jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别

    jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别 现在做的一个项目,所使用的框架是基于jQuery扩展的,于是平时学了一下jQuery,了解到了它的扩展函数: ...

  6. 33-Java中的String,StringBuilder,StringBuffer三者的区别

    转载自:https://www.cnblogs.com/su-feng/p/6659064.html StringBuilder 详解 (String系列之2) Java中的String,String ...

  7. 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)

    开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...

  8. iOS中break、continue、return三者的区别

    iOS中break.continue.return三者的区别 1. break         直接跳出当前层次的循环. 如果嵌套循环如for中嵌套while,break只能跳出内层的while循环, ...

  9. 问题:C# List;结果:C#中数组、ArrayList和List三者的区别

    C#中数组.ArrayList和List三者的区别 分类: [C#那些事] 2013-03-11 00:03 36533人阅读 评论(23) 收藏 举报 目录(?)[+] 在C#中数组,ArrayLi ...

  10. SparkSQL 中 RDD 、DataFrame 、DataSet 三者的区别与联系

    一.SparkSQL发展: Shark是一个为spark设计的大规模数据仓库系统,它与Hive兼容      Shark建立在Hive的代码基础上,并通过将Hive的部分物理执行计划交换出来(by s ...

随机推荐

  1. 完全背包问题 POJ1384

    完全背包即物品的数量不收限制, 根据01背包的思想,因为每件物品只能选1个,则要求我们不能依赖已选择物品i的选项的时候,所以需要逆序遍历 则在完全背包问题中,我们需要正序遍历. 此题时要求求出最小价值 ...

  2. VS经常报错的link error 2019

    VS经常报错的link error 2019 原因如下: 可能是找得到头文件,但是相关的dll或者lib找不到,需要在配置里面添加相应的库文件. project=>configuration.. ...

  3. 日志log使用序列反序列加密(Serializer) DESCrypto 加密

    若一次加密一个文件内容,文件内容不会更新变化,网上大多数序列化反序列加密程序是没问题的. 1:由于log文件的随时会更新内容,那网上常用的程序是行不通的.需要做修改 若想通过打开txt , using ...

  4. ngxtop:在命令行实时监控 Nginx 的神器

    Nginx网站服务器在生产环境中运行的时候需要进行实时监控.实际上,诸如Nagios, Zabbix, Munin 的网络监控软件是支持 Nginx 监控的. 如果你不需要以上软件提供的综合性报告或者 ...

  5. ActiveX控件dsoFramer的使用(word、excel、PPT)

    dsoframer是微软提供一款开源的用于在线编辑.调用Word. Excel .PowerPoint等的ActiveX控件.国内很多著名的OA中间件,电子印章,签名留痕等大多数是依此改进而来的. 一 ...

  6. [VBS脚本]定时提示并关闭计算机

    一.Natalia.bat 双击这个文件可以运行Natalia 控制台在打开后会变成最小化,标题为PowerAssistant,黑色背景淡绿色文字 运行脚本Natalia.vbs @ECHO OFF ...

  7. jsp_注释

    jsp支持两种注释的语法操作,一种是显示注释(在客户端允许看的见),另一种是隐式注释 显示注释:<!--注释内容--> 隐式注释: 格式一://单行注释 格式二:/*多行注释*/ 格式三: ...

  8. 关于SQL Server 2008添加用户映射问题 解决办法

    同事一直需要用触发器 但是之前的数据库没有dbo映射 无法添加 查阅了很多资料 不适合自己的问题 所以自己动手丰衣足食 特留下笔记 希望能给遇到相同问题的朋友一个解决的思路

  9. 部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程)

    部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程) 这些功能也能帮助用户了解和监控SQLSERVER的运行情况 DBCC语句,DBCC语句是SQL2005的数据库控制台命令 D ...

  10. Android 5.x特性概览一

    2014年,Google 携 Android 5.X 重装回归.迄今为止已有已有两年有余,全新设计的 UI风格和更加强悍的性能,再一次奠定了Android 的霸主地位.本文将就 UI 方面 Googl ...