copy相关知识点

copy相关知识点

  • copy 和 mutableCopy 都是创建副本,只是copy创建的是不可变副本,mutableCopy创建的是可变副本
  • 深拷贝:内容拷贝,是两个对象,改变其中一个不会影响另一个
  • 浅拷贝:指针拷贝,是一个对象,引用计数器加一,改变其中一个会影响另一个
  • 只有当不可变对象创建不可变副本的时候是浅拷贝,其他的都是深拷贝
只有NSString、NSArray、NSDictionary执行copy操作时才是浅拷贝
自定义类实现copy、mutableCopy操作
  • 让类遵守
  • 让类显示相应的方法
- (id)copyWithZone:(NSZone *)zone
{
    // 1.创建一个新的对象
    Person *p = [[[self class] allocWithZone:zone] init];
    
    // 2.设置当前对象的内容给新的对象
    p.name = _name;
    
    // 3.返回新的对象
    return p;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
    // 1.创建一个新的对象
    Person *p = [[[self class] allocWithZone:zone] init];
    
    // 2.设置当前对象的内容给新的对象
    p.name = _name;
    
    // 3.返回新的对象
    return p;
}
  • 需要注意一点,当子类也需要实现copy、mutableCopy操作的时候
  • 由于父类遵守了协议,并且实现了方法,只需要在子类中重写方法就可以了
- (id)copyWithZone:(NSZone *)zone
{
    // 1.创建副本
    id obj = [super copyWithZone:zone];
    // 2.设置数据给副本
    // 这里设置的数据是子类独有的属性,父类的属性已经在上一句代码中完成了
    [obj setHeight:_height];
    
    // 3.返回副本
    return obj;
}

你可能感兴趣的:(copy相关知识点)