iOS 真正的理解深浅拷贝

此篇文章为了纪念26K的大神

举个

有一个对象,Person 里面有两个属性 name,age 假设都是字符串 这时候调用Pereson copy

要知道,自定义对象想支持copy 需要实现coping协议,实现copy函数

copyWithZone

具体是深拷贝 还是浅拷贝 就看这个函数怎么实现了

/**  浅拷贝 */
- (id)mutableCopyWithZone:(NSZone *)zone{

    Person *person =  [[Person allocWithZone:zone] init];
    person.age = self.age;
    person.name = self.name;
    
    return person;
}
/**  深拷贝 */
- (id)mutableCopyWithZone:(NSZone *)zone{

    Person *person =  [[Person allocWithZone:zone] init];
    person.age = [self.age copy];
    person.name = [self.name copy];
    //注意如果Person包含了别的自定义对象,那每个属性都要这样copy
    return person;
}

不能理解的话 这里还有两张图可以看图理解一下


浅拷贝

深拷贝
  • 浅拷贝即使copy出一个新的对象但它的属性还是指向旧对象的内存地址
  • 而深拷贝的话 就是copy出一个和旧对象一点关系都没有的新对象 保证所有属性都开辟出新的内存空间

新的Person肯定是新的对象 新的内存地址 ,这样才发生了 copy 行为,像网上说的没有新内存地址那个不叫拷贝,那叫赋值

总结:
1.就是深拷贝是完整的复制了一个人,这个人复制出来就和本人没关系了,各自修改属性啥的都不影响
2.而浅拷贝可能会受到本人的改变而改变,因为他的各种属性还是指向本人的内存地址

系统级的函数 都是浅拷贝
所有集合类API 都是浅拷贝

新增内容

你可能感兴趣的:(iOS 真正的理解深浅拷贝)