探寻深浅拷贝

1.前言

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


2.copy与mutableCopy的官方解释

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

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


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<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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • “咚咚咚......” “请问一下,那个坐在第二排的女生能不能出来一下?”夏凉问 “你叫我吗?当然愿意啦!我可是您...
    纳兰诗巧阅读 1,787评论 1 3
  • 该是我很幸运的才遇到这样的你,不正经八个的帅也不澄丽堂皇的富,但却额外包容我的你。尽管我对你百般要求虽也抬过杠但是...
    白一夕阅读 2,726评论 0 2
  • 我和春天有个约会 如果你愿意 我可以永远像现在这般美丽 因为我生而为爱痴迷 如果你有情 这世界可以不需要再有四季 ...
    杨小熙i阅读 2,875评论 4 7
  • 人虽然渺小,人生虽然短促,但并不可怕;因为人能学,人能修身,人能自我完善,人的可贵在于人自身,当然丰富的阅历来自叠...
    空杯悟阅读 1,576评论 0 0

友情链接更多精彩内容