探寻深浅拷贝

2019-03-12  本文已影响0人  CoderChou

1.前言

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


2.copy与mutableCopy的官方解释

image

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

  1. 被拷贝对象为NSMutableString
image

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


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

- (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的区别

@property (nonatomic, strong) NSMutableArray *skills;

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

warer.skills = arr;

- (void)setSkills:(NSMutableArray *)skills{
    // copy修饰符 生成新的对象
    _skills = [skills copy];
}
// 如果执行 NSMutableArray的方法,则会crash
[warer.skills addObject:@"soil"];
crash
Demo地址
个人Blog:allenchou.xyz
上一篇 下一篇

猜你喜欢

热点阅读