首先 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. .net下各个数据类型所占用的字节

    Console.WriteLine(sizeof(int)); Console.WriteLine(sizeof(short)); Console.WriteLine(sizeof(char)); C ...

  2. 树形菜单的json字符串的拼接

    最近在学习权限管理, 要用到树形按钮, 但是字符串的拼接是一个难理解的问题, 然后从网上找了一个从前台用js来遍历组成这个json字符串, 很好! 但是没看懂... var data = [ {&qu ...

  3. Nginx 获取真实 IP 方案

    问题根源: 基于七层的负载均衡系统,获取IP的原理都是通过XRI和XFF进行处理,从中选出“正常情况下”的源头IP,然而这两个Header都是普通的HTTP头,任何代理程序都可以轻易修改伪造它们,使得 ...

  4. 使用 IntraWeb (45) - 活用 IntraWeb

    asp.net 刚开始时, 也是拖拉控件, 但后来有了 MVC.xNext. 换个思路使用 IntraWeb 吧: 界面全部用 html+js+css 实现(有些会是用 Delphi 动态生成), 然 ...

  5. Round函数

    Round():函数返回一个数值,舍入到指定的长度或精度 eg: --1) ) ---->123.9990 ) ---->124.0000 --3为需要舍入的位数 --2) ) ----- ...

  6. windows7 自带l2tp/ipsec VPN客户端连接Cisco ASA

    搞了半天,最后发现其实很简单,在ASA默认配置的基础上,把所有crypto ipsec ikev1 transform-set 加上mode transport,然后把tunnel-group Def ...

  7. Coins(HDU 2844):一个会超时的多重背包

    Coins  HDU 2844 不能用最基础的多重背包模板:会超时的!!! 之后看了二进制优化了的多重背包. 就是把多重转变成01背包: 具体思路见:http://www.cnblogs.com/tt ...

  8. iOS中数字的格式化 NSNumberFormatter

    NSNumberFormatter 和NSDateFormatter 是NsFormatter的子类. NSNumberFormatter类有个属性numberStyle,它是一个枚举型,设置不同的值 ...

  9. sqlplus实现上下翻页设置

    环境: 操作系统:red hat 5.8 OS 数据库:oracle 11g 11.2.0.1 安装软件:IO-Tty-1.07.tar. Term-ReadLine-Gnu-1.16.tar.uni ...

  10. delphi中获取调用堆栈信息

    异常堆栈有利于分析程序的错误,Delphi的Exception有StackTrace属性,但是值为空,因为StackTrace的信息收集Delphi委托给了第三方组件来完成,真是脑子有毛病! 借助于m ...