博客
关于我
Objective-C——判断对象等同性
阅读量:793 次
发布时间:2023-02-17

本文共 2527 字,大约阅读时间需要 8 分钟。

OC对象等同性深入理解

在软件开发中,无论使用何种语言,比较两个对象是否相等都至关重要。OC也不例外。我们从最基本的 NSString 比较开始,逐步深入探讨对象等同性的实现原理。

NSString对象的比较

假设我们有以下代码:

NSString *str1 = [[NSString alloc] initWithCString:"equal" encoding:NSUTF8StringEncoding];NSString *str2 = @"equal";if (str1 == str2) {    NSLog(@"equal");}

这段代码看似简单,但运行结果却令人困惑。尽管 str1str2 表面上看起来相等,但由于比较的是对象指针的相等性,而不是实际的字符串内容,导致结果总是 false

正确的比较方法

为了正确比较两个字符串,我们应该使用 isEqual: 方法:

NSString *str1 = [[NSString alloc] initWithCString:"equal" encoding:NSUTF8StringEncoding];NSString *str2 = @"equal";if ([str1 isEqual:str2]) {    NSLog(@"equal");}

这里 isEqual: 方法在 NSString 类中被精细实现,真正比较的是字符串内容,而不是对象指针。因此,输出 "equal" 是正确的。

自定义对象的等同性实现

为了更深入理解,我们可以创建一个自定义类 EqualObject,并实现 isEqual: 方法。

@interface EqualObject : NSObject@property (nonatomic, strong) NSString *name;@end@implementation EqualObject@end

创建两个 EqualObject 实例并比较:

EqualObject *object1 = [EqualObject new];EqualObject *object2 = [EqualObject new];if ([object1 isEqual:object2]) {    NSLog(@"equal");}

此时,输出结果仍为 false,因为 isEqual: 方法的默认实现是比较对象指针是否相同。因此,我们需要自定义 isEqual: 方法:

-(BOOL)isEqual:(id)object {    if ([self class] == [object class]) {        if (![self.name isEqual:object.name]) {            return NO;        }        return YES;    } else {        return [super isEqual:object];    }}

这段代码首先检查对象的类别是否相同,然后比较 name 属性。如果 name 相同,返回 true,否则返回 false

定制等同性方法

为了更精确地控制等同性,我们可以为 EqualObject 类添加定制的 isEqualToEqualObject: 方法:

-(BOOL)isEqualToEqualObject:(EqualObject *)object {    if (self == object) {        return YES;    }    if (![self.name isEqualToString:object.name]) {        return NO;    }    return YES;}-(BOOL)isEqual:(id)object {    if ([self class] == [object class]) {        return [self isEqualToEqualObject:object];    } else {        return [super isEqual:object];    }}

客户端代码变为:

if ([object1 isEqualToEqualObject:object2]) {    NSLog(@"equal");}

这样可以更明确地比较对象的等同性。

对象Hash码

每个 OC 对象都有一个 hash 方法,用于计算对象的哈希值。集合(如 NSArrayNSSet 等)使用哈希值来存储对象,以提高存取效率。

-(NSUInteger)hash {    NSUInteger nameHash = [_name hash];    return nameHash;}

如果对象的 hash 值相同,但对象内容不同,可能导致潜在的冲突。为了避免这种情况,我们可以自定义 hash 方法:

-(NSUInteger)hash {    NSUInteger nameHash = [_name hash];    NSUInteger ageHash = _age;    return nameHash ^ ageHash;}

集合的等同性比较

对于 NSArrayisEqual: 方法默认比较每个元素的位置:

NSArray *array1 = @[object1, object2];NSArray *array2 = @[object1, object2];if ([array1 isEqual:array2]) {    NSLog(@"equal");}

如果数组中的元素位置相同且每个元素相等,数组才被认为相等。

注意事项

在使用集合(如 NSSet)时,需注意其 isEqual:hash 方法的行为。为了避免冲突,应确保所有对象的 hash 值和内容都唯一。

通过以上方法,我们可以更好地理解和实现对象等同性的原理,从而在实际开发中更高效地管理对象比较和存储。

转载地址:http://gynfk.baihongyu.com/

你可能感兴趣的文章
NSGA-Ⅲ源代码
查看>>
nsis 安装脚本示例(转)
查看>>
NSJSON的用法(oc系统自带的解析方法)
查看>>
nslookup 的基本知识与命令详解
查看>>
NSOperation基本操作
查看>>
NSRange 范围
查看>>
NSSet集合 无序的 不能重复的
查看>>
NSURLSession下载和断点续传
查看>>
NSUserdefault读书笔记
查看>>
NS图绘制工具推荐
查看>>
NT AUTHORITY\NETWORK SERVICE 权限问题
查看>>
NT symbols are incorrect, please fix symbols
查看>>
ntelliJ IDEA 报错:找不到包或者找不到符号
查看>>
NTFS文件权限管理实战
查看>>
ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
查看>>
ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
查看>>
ntp server 用法小结
查看>>
ntpdate 通过外网同步时间
查看>>
ntpdate同步配置文件调整详解
查看>>
NTPD使用/etc/ntp.conf配置时钟同步详解
查看>>