探寻深浅拷贝

1.前言

开发过程中常常需要拷贝属性、容器、模型,修改拷贝对象,是否会对原对象产生影响等,这就是 copymutableCopy的区别


2.copy与mutableCopy的官方解释

  • copy = 浅拷贝
  • 拷贝了对象的指针,两者指向同一内存地址
  • 拷贝对象与原对象的关系就是影子与本尊的关系
探寻深浅拷贝_第1张图片
浅拷贝
  • mutableCopy = 深拷贝
  • 拷贝了对象的内容,两者指不同内存地址
  • 拷贝对象与原对象的关系就是克隆人与本尊的关系
探寻深浅拷贝_第2张图片
深拷贝

图片有误内存地址应该不同


3.NSStringNSMutableString的深浅拷贝

  1. 被拷贝对象为NSString

image

mutableCopy产生了一个新的对象, copy修饰的对象则指向了同一内存地址

  1. 被拷贝对象为NSMutableString
image

无论是 mutableCopy还是copy产生的对象都是新对象。
适用于NSArray NSMutableArray NSDictionary NSMutableDictionary


4.自定义对象实现深浅拷贝

  • 声明自定义类,如果不实现NSCopying,NSMutableCopying协议,则不具备深浅拷贝的能力
  • 使用runtime实现拷贝
- (id)copyWithZone:(NSZone *)zone {
    Warrior *warer = [Warrior new];
    unsigned int count = 0;
    objc_property_t *properties = class_copyPropertyList(self.class, &count);
    for (int i = 0; i

5.Property修饰符copy与strong的区别

  • copy修饰符
@property (nonatomic, strong) NSMutableArray *skills;

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"fire",@"water",@"ice", nil];

warer.skills = arr;

  • 这里的赋值操作就是执行setter方法
- (void)setSkills:(NSMutableArray *)skills{
    // copy修饰符 生成新的对象
    _skills = [skills copy];
}
  • 生成新的对象且不可变
// 如果执行 NSMutableArray的方法,则会crash
[warer.skills addObject:@"soil"];

crash

Demo地址
个人Blog:allenchou.xyz

你可能感兴趣的:(探寻深浅拷贝)