六.对象相等性判断和NSCopying协议

1.对象等同性
NSObject 协议判断等同性的两个方法(当且仅当支持值完全相同,两个对象才完全相等)
@protocol NSObject

  • (BOOL)isEqual:(id)object;

@property (readonly) NSUInteger hash; //(对象相等hash值相等,反之不一定;hash一般用作哈希码索引,用在Array,Dictionary,Set集合中)
1.1一般自定义对象判断相等都只要判定属性值是否相等,改写如上两个方法就可以实现

//所有属性相同两个对象就相同(ps:如果该对象是数据库里面创建的对象,我们只要判断主键是否相等即可)
- (BOOL)isEqual:(id)aObject
{
    if(self == aObject) return YES;
    if ([self class] != [aObject class]) return NO;

    HsCodeInfo *codeInfo = (HsCodeInfo*)aObject;
    return ([_code isEqualToString:[codeInfo getCode]] && _codeType == [codeInfo getCodeType]);
}
//如下方法构建hash值就可以保存唯一
- (NSUInteger)hash
{
    NSString *hashStr = [NSString stringWithFormat: @"%d-%@", _codeType, _code];
    return [hashStr hash];
}

1.2另外如果要更加美观,提交监测速度,可以类推isEqualToString方法构建一个,修改isEqual方法

//省去类型判断
- (BOOL)isEqualToCodeInfo:(HsCodeInfo*)codeInfo
{
    if(self == codeInfo) return YES;

    return ([_code isEqualToString:[codeInfo getCode]] && _codeType == [codeInfo getCodeType]);
}

//同时修改如下方法
- (BOOL)isEqual:(id)object
{
    if ([self class] == [object class]){
        return [self isEqualToCodeInfo:(HsCodeInfo*)object];
    }else{
        return [super isEqual:object];
    }
}

1.3尽量不要把可变对象放入集合后,又再次修改可变对象。(可能会导致set集合里面保护重复对象)

- (void)testDuplicateSet
{
    NSMutableSet *set = [NSMutableSet new];
    NSMutableArray *classIdArr1 = [@[@10042,@10043] mutableCopy];
    [set addObject:classIdArr1];//set = {((10042,10043))}
    NSMutableArray *classIdArr2 = [@[@10042] mutableCopy];
    [set addObject:classIdArr2];//set = {((10042),(10042,10043))}
    [classIdArr2 addObject:@10043];//有重复对象了  set = {((10042,10043),(10042,10043))}

    //如何修复
    NSSet *set2 = [set copy]; //恢复正常 set2 = {((10042,10043))}
}

2.如果自定义的类要实现copy方法(其实调用的是copyWithZone),就要实现NSCopying协议

  • (id)copyWithZone:(nullableNSZone *)zone;(zone参数不用考虑现在都不用了)
//  HsCodeInfo.h
@interface HsCodeInfo : NSObject<NSCopying>
{
    short  _codeType;
    NSString *_code;
}
@end
//  HsCodeInfo.m
#import "HsCodeInfo.h"
@implementation HsCodeInfo
-(id)initWithCode:(NSString*)stockcode AndType:(short)type
{
    self = [super init];
    if (self) {
        _code = [(stockcode==nil?@"":stockcode) copy];
        _codeType = type;
    }
    return self;
}
-(id)copyWithZone:(NSZone *)zone
{
    HsCodeInfo *codeInfo = [[HsCodeInfo allocWithZone:zone]initWithCode:_code AndType:_codeType];
    //如有需要这里还可以做其他数据结构的拷贝,如集合。不过要考虑清楚这里添加了,每次调用copy都会调用,如果是比较复杂的结构,建议还是新建一个接口
    return codeInfo;
}
@end

2.1copy和mutableCopy 一般调用关系如下所示
(可变对象通过不可变对象mutableCopy获取)
-[ NSArraymutableCopy] => NSMutableArray

NSMutableArray *classIdArr2 = [@[@10042] mutableCopy];

(不可变对象通过可变对象copy获取)
-[ NSMutableArraycopy] => NSArray

NSMutableArray *mutableArr = [NSMutableArray arrayWithObjects:@1,@2, nil];
NSArray *immutableArr = [mutableArr copy];

如果你发现本文对你有所帮助,如果你认为其他人也可能受益,请把它分享出去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  • 前言 对数据的等同性判断包括对基本数据类型等同性的判断和对象等同性的判断。对基本数据类型等同性的判断是非常简单的,...
    VV木公子阅读 1,442评论 0 8
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,076评论 1 32
  • 前言   本文是对《Effective Objective-C 2.0编写高质量iOS和OSX代码的52个有效方法...
    WhiteZero阅读 712评论 0 2
  • 他坐在桌子旁边,微闭着双眼,右手有节奏的在桌面上敲击。好像在思考什么事情;又好像在听一出戏曲。头上的白发在一束射进...
    8a3f5ff1256e阅读 103评论 0 3
  • 流动着古情调的怀,淌着现代的步调,淑化木讷下涌着嘻哈风度的不着调调,有节奏地数着岁数,倚老卖老还不够,尬着吧[憨笑...
    唐心可人儿阅读 133评论 0 2