iOS开发中的对象等同性

前言

Objective-C作为一门面向对象编程的语言,我们在使用它开发的时候,接触的最多的就是类与对象了。
我们在使用对象的时候,往往需要判断两个对象是否相等,这种相等包含两种含义:1.在程序上是否是同一块内存地址。2.在语义上,是否能指代同一对象。
这就是对象的等同性
关于如何判断两个对象是否相同,我们由浅至深通过代码逐渐分析:

目录

正文

首先,为了能够对对象进行方便操作,我们定义一个 Person 的类,其中含有 name 和 gender 两个属性,当两个 person 的 name 和 gender 同时一致时,我们认为这两个对象指代同一个人。

一. == 操作

第一步,既然要进行相等判断,就可以使用 == 来进行

    Person *person1 = [[Person alloc] init];
    Person *person2 = nil;

    person2 = person1;
    NSLog(@"person1 == person2: %d", person1 == person2);

此时的输出结果为:

person1 == person2: 1

这样就能表示两个 Person 是相等的吗? 并不是,看下面代码:

    Person *person1 = [[Person alloc] init];
    person1.name = @"张三";
    person1.gender = PersonGenderMan;

    Person *person2 = [[Person alloc] init];
    person2.name = @"张三";
    person2.gender = PersonGenderMan;

    NSLog(@"person1 == person2: %d", person1 == person2);

此时的输出结果为:

person1 == person2: 0

很显然,这并不能满足我们对于 Person 类相等的设定。同时也可以得出结论: == 操作只有分辨两个对象是否是同一内存地址的功能。

二. - isEqual: 与 hash

在Objective-C中,基本所有的对象都是继承自 NSObject 基类的,在 NSObject 基类的文档中,我们可以看到, NSObject 类实现了 NSObject 协议,而 NSObject 这个协议中,有 - (BOOL)isEqual:(id)object; 一个方法与 @property (readonly) NSUInteger hash; 这样一个属性需要类去实现,我们看一下官方文档对这两个东西的描述:
- isEqual:

Returns a Boolean value that indicates whether the receiver and a given object are equal.
Required.

hash

Returns an integer that can be used as a table address in a hash table structure.
Required.

大意就是说 - (BOOL)isEqual:(id)object; 这个方法是用来判断两个对象是否相等的。而 hash 是用在哈希表表结构的表地址。
由文档我们可知, - isEqual: 方法返回 YES ,那么 hash 必然相等; 如果 hash 相等,那么 - isEqual: 返回的不一定是 YES 。

三. - isEqual: 的系统实现

系统是如何实现 - isEqual: 的呢,看下面代码:

    Person *person1 = [[Person alloc] init];
    person1.name = @"张三";
    person1.gender = PersonGenderMan;

    Person *person2 = person1;

    Person *person3 = [[Person alloc] init];
    person1.name = @"张三";
    person1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值