美文网首页
探寻深浅拷贝

探寻深浅拷贝

作者: CoderChou | 来源:发表于2019-03-12 09:36 被阅读0次

1.前言

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


2.copy与mutableCopy的官方解释

  • copy = 浅拷贝
  • 拷贝了对象的指针,两者指向同一内存地址
  • 拷贝对象与原对象的关系就是影子与本尊的关系
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<count; i++) {
        objc_property_t propertyNameString = properties[i];
        const char *name = property_getName(propertyNameString);
        NSString *propertyName = [NSString stringWithUTF8String:name];
        id value = [self valueForKey:propertyName];
        if (value) {
            [warer setValue:value forKey:propertyName];
        }
    }
    free(properties);

    return warer;
}
// or
- (id)copyWithZone:(NSZone *)zone {
    Striker *ster = [Striker new];
    ster.name = @"athey";
    ster.gunshot = 550.f;
    return ster;
}

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

相关文章

  • 探寻深浅拷贝

    1.前言 开发过程中常常需要拷贝属性、容器、模型,修改拷贝对象,是否会对原对象产生影响等,这就是 copy与mut...

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • Python—浅拷贝与深拷贝

    浅拷贝 深拷贝 深浅拷贝的作用

  • 深浅拷贝

    先来了解一下这些:在js中变量类型基本分为两种:基本数据类型和引用数据类型;基本类型:Underfied Null...

  • 深浅拷贝

    浅拷贝是对一个对象的顶层拷贝。通俗的理解就是:拷贝了引用,并没有拷贝内容。 深拷贝是对于一个对象所有层次的拷贝(递...

  • 深浅拷贝

    深浅拷贝.copy 浅拷贝 这是一个方法,浅拷贝修改可变类型是会将原数据也一块修改 Copy.deepcopy 深...

  • 深浅拷贝

    1:is 和 ==的区别 is 是比较两个引用是否指向了同一个对象(地址引用比较)。== 是比较两个对象是否相等。...

  • 深浅拷贝

    函数的传递,与matlab不同,具有以下特点: 1.直接赋值会带来不同ID,例如,a=2,b=2 2.传递引用赋值...

  • 深浅拷贝

    最近一直被问到深浅拷贝的问题。自己也确实不太清楚怎么回事,现在来研究一下。 什么是深浅拷贝 浅拷贝:指针拷贝,不会...

网友评论

      本文标题:探寻深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/razwpqtx.html