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

转自:
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决定其存储位置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值