亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Objective-C——判斷對象等同性

2019-11-14 18:32:44
字體:
來源:轉載
供稿:網友

對象等同性

無論我們使用什么語言,總是會出現需要判斷兩個對象是否相等的情況,OC當然也不例外。首先看一段代碼:

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

很明顯,在我們開來,str1和str2是“相等的”。但是事實上equal是不會被打印的。這是因為如果我們直接比較兩個對象是否相等,實際上比較的是兩個對象的指針是否相等。

上述代碼中str1和str2是分別指向兩塊不同的內存的,所以肯定不會像等了。

我們稍微修改一下代碼再看看:

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

注意看加粗語句,我們改用NSObject提供的isEqual方法比較,發現"equal"被打印了出來。因為isEqual在NSString 內部被實現的時候比較的是真正的字符串是否相等!

 

對象等同性實現

看過上面例子后,現在我們自己創建一個類來進一步說明等同性

#import <Foundation/Foundation.h>@interface EqualObject : NSObject@PRoperty(nonatomic ,strong)NSString *name;@end#import "EqualObject.h"@implementation EqualObject@end

定義了一個EqualObject類,有一個name屬性。

現在我們創建兩個對象來比較一下:

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

發現代碼運行結束并沒有輸出"equal",原因就在于isEqual方法是需要我們自己實現的。NSObject的isEqual:方法默認是比較兩個對象指向的地址是否相等,這里開辟了兩個對象肯定不想等了。

現在我們添加isEqual:方法的實現:

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

這里稍微解釋一下,為什么兩個對象不同類就調用父類的isEqual:這是因為,有的時候我們是可以讓子類等于父類的,我們只需要關注屬性是否相同時可以這樣寫,如果不需要也可以不在父類處理那么久默認不相等了。

現在我們不對name進行賦值操作依然是沒有值打印出來的。

修改客戶端代碼:

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

發現這時候在運行就已經相等了。

 

為類定制等同性方法

我們可以看到NSString除了可以用isEqual比較是否相等意外,還可以使用isEqualToString來比較!這是專為NSString類定制的等同性方法,提供這樣的方法就可以很明確我們實現了該對象的isEqual方法。

下面為EqualObject提供定制的等同性方法,并修改isEqual:方法

- (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");        }

很順利的"equal"了...

 

對象hash碼

每一個OC對象內部都是有一個hash碼的,當對象存入集合中(Array,Set,HashTable等),那么他們的hash碼會被當做鍵來決定他們該放入哪一個集合中。

首先我們先看一下集合內部是如何存儲的

hashCodesubCollection
code1value1,value2,value3,value4
code2value5,value6
code3value7
code4value8,value9,value10

 

 

 

 

 

集合的內部并不像我們所想的那樣,是一個hash表,它將插入的對象根據hashCode來決定放入哪一個子集合。如果要刪除或者比較集合內元素,它首先根據hashCode找到子集合,然后跟子集合的每個元素比較。

所以如果我們的對象的hashCode如果都相同,那么就會出現嚴重的效率問題,

理論上來說,我們確定等同性的兩個對象的hash應該是相同的而不等的兩個對象hash也應該不等,這樣在存入hashTable之類的集合時,就會避免相同對象的重復添加,比如我們兩個對象hash相等,但實際對象不等,那么添加的時候就會被添加到同一subCollection下面。

所以為了避免這種情況,我們盡量自己實現一種避免重復的方式,

這里提供一種,添加一個新屬性age,hash實現如下:

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

 

集合中的對象等同性

我們對NSArray調用isEqual方法,它會對集合里的每個對象和另一個集合相同位置的對象進行isEqual:操作,只有全部相等,兩個集合才相等。

這里說一下,集合里面最后添加都是不可變元素,如果是可變性元素會出現不法控制的情況。

比如我們往NSSet里面添加兩個NSMutableArray,一開始兩個array不等,那么set中就有兩個元素。

然后修改一個array使兩個相等,這是set中就會有兩個相等的元素存在!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人免费视频| 国产欧美精品在线| 精品久久久久久久久久久| 成人精品网站在线观看| 热re99久久精品国产66热| 日韩av电影手机在线观看| 日韩美女毛茸茸| 色综合影院在线| 国产精品成人一区| 亚洲天堂男人天堂女人天堂| 亚洲视频欧洲视频| 欧美一级大片在线观看| 自拍偷拍亚洲一区| 大量国产精品视频| 亚洲精品自拍视频| 欧美另类99xxxxx| 欧美日韩在线视频一区二区| 欧美另类极品videosbest最新版本| 成人国产精品日本在线| 亚洲视频免费一区| 久久久视频精品| 中文字幕一区二区精品| 97涩涩爰在线观看亚洲| 亚洲午夜国产成人av电影男同| 日韩在线观看电影| 国内精久久久久久久久久人| 日韩亚洲在线观看| 欧美激情在线观看视频| 欧美日韩中国免费专区在线看| 日韩电影免费在线观看中文字幕| 亚洲aaaaaa| 九九热精品视频在线播放| 国产一区二区三区欧美| 国产精品国语对白| www.亚洲免费视频| 一本一本久久a久久精品牛牛影视| 北条麻妃99精品青青久久| 一区二区日韩精品| 国产成人97精品免费看片| 亚洲国产99精品国自产| 国产午夜精品一区二区三区| 91青草视频久久| 亚洲欧美日韩图片| 国产成人午夜视频网址| 69影院欧美专区视频| 亚洲欧美一区二区精品久久久| 国产日韩欧美自拍| 亚洲奶大毛多的老太婆| 日韩av大片免费看| 日韩精品在线私人| 欧美激情亚洲一区| 亚洲一区二区三区四区视频| 久久久精品视频在线观看| 欧美成人黄色小视频| 欧美激情视频一区二区三区不卡| 欧美成aaa人片免费看| 亚洲精品第一国产综合精品| 国产乱人伦真实精品视频| 久热精品视频在线| 欧美日韩亚洲一区二区三区| 欧美性猛交xxxxx水多| 在线观看视频99| 成人字幕网zmw| 久久久精品视频成人| 永久免费精品影视网站| 久久99国产精品久久久久久久久| 日韩黄色av网站| 热久久免费视频精品| 亚洲jizzjizz日本少妇| 中文字幕欧美日韩va免费视频| 国产福利精品视频| 日本精品久久久久影院| 国产日韩中文字幕在线| 欧美一级淫片丝袜脚交| 中文.日本.精品| 欧美在线亚洲在线| 久久久伊人欧美| 不卡伊人av在线播放| 日本久久久久久久久| 欧美大尺度电影在线观看| 欧美电影院免费观看| 97香蕉久久超级碰碰高清版| 91久久久久久久久久久久久| 在线电影欧美日韩一区二区私密| 亚洲精品成人久久久| 91产国在线观看动作片喷水| 国产精品综合网站| 国产一区二区成人| 不卡伊人av在线播放| 欧美成人精品在线| 国产日韩欧美视频| 国产精品久久久久秋霞鲁丝| 成人a免费视频| 欧美激情精品久久久| 亚洲aa在线观看| 久久免费少妇高潮久久精品99| 亚洲激情在线观看| 色悠悠久久88| 久久精品国产一区| 亚洲日本欧美日韩高观看| 中文字幕日韩在线视频| 欧美刺激性大交免费视频| 欧美日韩在线第一页| 亚洲天堂男人天堂| 久久精品成人一区二区三区| 色狠狠av一区二区三区香蕉蜜桃| 欧美xxxx18性欧美| 日韩av黄色在线观看| 亚洲国产精品专区久久| 日韩久久免费视频| 九九视频直播综合网| 亚洲级视频在线观看免费1级| 4438全国成人免费| 永久免费精品影视网站| 国产精品一区二区三区免费视频| 欧美福利小视频| 欧美日韩国产成人在线观看| 欧美三级xxx| 最近中文字幕mv在线一区二区三区四区| 日韩av在线电影网| 韩国三级日本三级少妇99| 中文字幕视频在线免费欧美日韩综合在线看| 久久精品这里热有精品| 亚洲片在线观看| 日韩美女毛茸茸| 欧美最近摘花xxxx摘花| 日韩成人激情视频| 日韩精品小视频| 成人黄色中文字幕| 97人人爽人人喊人人模波多| 欧美日韩国产第一页| 美女扒开尿口让男人操亚洲视频网站| 欧美高清视频在线观看| 成人午夜两性视频| 伊人久久大香线蕉av一区二区| 精品国产91久久久| 国产精品91在线观看| 中文字幕成人精品久久不卡| 久久露脸国产精品| 国产综合视频在线观看| 欧美极品少妇xxxxⅹ喷水| 久久久久久综合网天天| 国产97在线播放| 亚洲成人在线网| 亚洲国产一区二区三区四区| 日韩中文字幕视频在线观看| 国产成人+综合亚洲+天堂| 国产精品白嫩初高中害羞小美女| 精品美女久久久久久免费| 欧美激情中文网| 国内精品400部情侣激情| 欧美成人免费播放| 一本色道久久88综合日韩精品| 欧美限制级电影在线观看| 色悠悠国产精品| 中文字幕亚洲欧美在线| 亚洲第一精品夜夜躁人人爽| 久久久精品视频成人| 欧美精品在线观看91| 国产午夜一区二区| 免费97视频在线精品国自产拍| 日韩精品在线观| 狠狠躁夜夜躁久久躁别揉| 中文国产亚洲喷潮|