您的位置:首页 > Web前端

<<Effective OC>>读书笔记 --- 第八条 理解“对象等同”这一概念

2016-11-07 13:57 225 查看
转自:

1、http://blog.csdn.net/womendeaiwoming/article/details/46419323

2、http://www.tuicool.com/articles/yIf6BjQ

比较两个对象是否相等是一个常用的功能。==操作符比较的不是对象,而是两个指针本身,一般来说这不是咱们所想要的。要想判断对象是否相等,应该使用 NSObject 协议中声明的isEqual:方法来判断。

@interface Person : NSObject <NSCopying>
@property (nonatomic, copy) NSString *name;
@end

@implementation Person

- (BOOL)isEqual:(id)object {
if (self == object) return YES;
if (![object isKindOfClass:[Person class]]) return NO;

return [self.name isEqualToString:[object name]];
}

// Person.m
- (NSUInteger)hash {
return [self.name hash];
}

- (id)copyWithZone:(NSZone *)zone {
// (NSZone *)zone的含义就是为要建副本对象已经准备好了新开辟的内存空间
// 所有copy出来的对象是一个新的对象,修改它的属性不会影响源对象
// 这里[Person alloc]最好写成[self class]
// 注:[self class]返回的是类,打印出来就相当于类名
// 这样子,子类继承就不用修改基类代码
Person *person = [[***[self class]*** allocWithZone:zone] init];
person.name = self.name;
return person;
}
@end

- (void)test {
Person *person = [[Person alloc] init];
person.name = @"Lili";

NSDictionary *dic = @{person: @1};
Person *personCopy = [person copy];

id object = [dic objectForKey:personCopy];
NSLog(@"%@", [person isEqual:personCopy] ? @"YES" : @"NO"); // 输出:YES
NSLog(@"%@", object);  // 输出:(null)
}


同时要注意不要修改原生类的 hash方法,因为hash table 需要hash code决定其存储位置。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: