iOS Developer

OC中对象是否相等判断

2017-08-02  本文已影响147人  黑色幽默_0d96

OC中,==号比较两个对象,是比较两个对象的地址,而 isEqual方法,是比较两个对象的值是否相等。

比如,NSString *str1 = @"1",NSString *str2 = @"1",NSString *str3 = [NSString stringWithFormat:@"1"];

BOOL flag1 = str1 == str2 ,flag1为true,因为对应@“1”,属于同一个常量被两个变量引用,它们指向的地址是相同的

BOOL flag2 = str1 == str3 ,flag2为false,因为str3是通过stringWithFormat创建,是重新分配了内存空间的,

BOOL flag3 = [str1 isEqualToString str2] ,flag3为true,因为isEqual方法是判断两个对象的值,并不关心内存地址

对于字符串,需要用isEqualToString来判断两个字符串是否相等,

对于其他继承自NSObject的对象呢,一般用isEqual来判断是否相等,千万不要用 ==,因为同一个类alloc出来的两个对象,地址是绝对不同的。

isEqual的原理,就要说到两个方法hash与isEqual,

OC的基类是NSObject,有两个对象方法

- (NSUInteger)hash

{

NSString *toHash = [NSString stringWithFormat:@"%ld", self.modelId];

return [toHash hash];

}

- (BOOL)isEqual:(id)object

{

return [self hash] == [object hash];

}

只要实现这两个方法,就可以让同一个类alloc出来的不同对象,满足某个条件时相等,这里用的是modelId

也就是只要两个对象的modelId属性相等,用isEqual方法判断两个对象,它们就相等

NSArray的contains方法,就是根据这个来判断某个对象是否包含在这个数组里的。

上一篇下一篇

猜你喜欢

热点阅读