Objective-c中 isEqual ,isEqualToString , == 三者的区别
首先 OC中的对象都是用指针表示,方法的调用是基于消息机制实现,== 比较的自然是指针指向的地址
然后 说下 isEqual 和 isEqualToString 的区别
IsEqual 是 NSObject 的方法 ,而 isEqualToString 是 NSString 的方法
因此从继承关系角度来说isEqualToString 是 isEqual 的衍生方法
首先贴个苹果官方重写isEqual 的demo
- - (BOOL)isEqual:(id)other {
- if (other == self)
- return YES;
- if (!other || ![other isKindOfClass:[self class]])
- return NO;
- return [self isEqualToWidget:other];
- }
- - (BOOL)isEqualToWidget:(MyWidget *)aWidget {
- if (self == aWidget)
- return YES;
- if (![(id)[self name] isEqual:[aWidget name]])
- return NO;
- if (![[self data] isEqualToData:[aWidget data]])
- return NO;
- return YES;
- }
简单说一下:
首先都会判断 指针是否相等 ,相等直接返回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://www.cnblogs.com/skyming/p/3485605.html
Objective-c中 isEqual ,isEqualToString , == 三者的区别的更多相关文章
- isEqual,isEqualTostring,==三者的区别
isEqual:首先判断两个字对象的类型是否相同,在判断内容是否相同,如果类型不同直接return no.如先判断是否都是 NSString,在判断string的内容. isEqualTostring ...
- 在Java中>、>>、>>>三者的区别
Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力 ...
- Objective C中nil/Nil/NULL的区别
nil:指向oc中对象的空指针 Nil:指向oc中类的空指针 NULL:指向其他类型的空指针,如一个c类型的内存指针 NSNull:在集合对象中,表示空值的对象 若obj为nil:[obj messa ...
- android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别
android Activity类中的finish().onDestory()和System.exit(0) 三者的区别 Activity.finish() Call this when your a ...
- jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别
jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别 现在做的一个项目,所使用的框架是基于jQuery扩展的,于是平时学了一下jQuery,了解到了它的扩展函数: ...
- 33-Java中的String,StringBuilder,StringBuffer三者的区别
转载自:https://www.cnblogs.com/su-feng/p/6659064.html StringBuilder 详解 (String系列之2) Java中的String,String ...
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...
- iOS中break、continue、return三者的区别
iOS中break.continue.return三者的区别 1. break 直接跳出当前层次的循环. 如果嵌套循环如for中嵌套while,break只能跳出内层的while循环, ...
- 问题:C# List;结果:C#中数组、ArrayList和List三者的区别
C#中数组.ArrayList和List三者的区别 分类: [C#那些事] 2013-03-11 00:03 36533人阅读 评论(23) 收藏 举报 目录(?)[+] 在C#中数组,ArrayLi ...
- SparkSQL 中 RDD 、DataFrame 、DataSet 三者的区别与联系
一.SparkSQL发展: Shark是一个为spark设计的大规模数据仓库系统,它与Hive兼容 Shark建立在Hive的代码基础上,并通过将Hive的部分物理执行计划交换出来(by s ...
随机推荐
- coreseek实战(二):windows下mysql数据源部分配置说明
coreseek实战(二):windows下mysql数据源部分配置说明 关于coreseek在windows使用mysql数据源的配置,以及中文分词的详细说明,请参考官方文档: mysql数据源配置 ...
- AngularJs自定义指令详解(3) - scope
我们之所以要定义指令,目的是重用指令.假设有这么一个应用场景:在同一个html里使用了两次my-directive,第一个my-directive要展示的是Hello World,第二个my-dire ...
- Top Data Scientists to Follow & Best Data Science Tutorials on GitHub
http://www.analyticsvidhya.com/blog/2015/07/github-special-data-scientists-to-follow-best-tutorials/ ...
- 贪心+构造( Codeforces Round #344 (Div. 2))
题目:Report 题意:有两种操作: 1)t = 1,前r个数字按升序排列: 2)t = 2,前r个数字按降序排列: 求执行m次操作后的排列顺序. #include <iostream&g ...
- Jade之Template Inheritance
Template inheritance jade支持通过关键字block和extends来实现模板继承. 比如,在layout.jade写上如下代码 html head title My Site ...
- Jade之Code
Code jade支持内嵌js的代码到jade代码之中. Unbuffered Code 无缓冲代码以-符号开始,无任何额外输出(文本是什么即是什么). jade: - for (var x = 0; ...
- Sql Server 相关错误问题及解决方法
1.首当其冲是登陆问题, SQL Server 2008选择Windows身份验证无法登录 (Microsoft Sql Server,错误:18456) 就是在连接SQL Server 2008时, ...
- NumberFormat usage
NumberFormat 是所有数值格式的抽象基类. 该类提供了格式化和分析数值的接口. NumberFormat 也提供了确定 哪个语言环境具有数值格式以及它们名字的方法. import java. ...
- 【实战】初识ListView及提高效率
简介: ListView是手机上最常用的控件之一,几乎所有的程序都会用到,手机屏幕空间有限,当需要显示大量数据的时候,就需要借助ListView来实现,允许用户通过手指上下滑动的方式将屏幕外的数据滚动 ...
- 【Visual Lisp】变体与安全数组
(vlax-make-variant) ;;创建一个未初始化的变体 ;;01.整型值变体(setq myvar (vlax-make-variant 10)) ;;创建整型值变体,返回 #<va ...