美文网首页
深复制与浅复制

深复制与浅复制

作者: 攻克乃还_ | 来源:发表于2017-12-01 20:35 被阅读10次

    小编致力于用精简的语言说明不精简的问题

    一、概念

    • 浅复制:拷贝指向对象的指针
    • 深复制:拷贝对象到另一块内存中

    二、对象拷贝遵循规则

    无论是集合类型NSArray、NSDictionary、NSSet ...,还是非集合类型NSString, NSNumber ... 对象,调用copy、mutableCopy方法时:

    • copy永远返回不可变对象
    • mutableCopy永远返回可变对象
    • 对于不可变对象进行copy操作,是指针赋值
    • 对于对象(无论可变不可变)进行mutableCopy操作,都是内容赋值

    注:下面代码是对的,只是改变了str对象的指针

    NSString *str = @"string";
    str = @"newString";
    

    三、集合拷贝遵循规则

    3.1.集合的浅复制
    • 进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合
    • 浅复制代码举例
    NSArray *shallowCopyArray = [someArray copyWithZone:nil];
    NSSet *shallowCopySet = [NSSet mutableCopyWithZone:nil];
    NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];
    
    3.2.集合的深复制

    方法1:initWithArray:copyItems:

    • 集合里的每个对象都会收到 copyWithZone: 消息。如果对象遵循 了NSCopying 协议,就会被深复制到新的集合。如果没有,用这种方法进行深复制,在运行时就会出错。copyWithZone: 方法只能够提供一层拷贝,而非真正的深拷贝
    NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];
    

    方法2:归档之后解挡

    NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
    
    3.3.集合的单层深复制 (one-level-deep copy)

    在多层数组中,对第一层进行内容拷贝,其它层进行指针拷贝

    参考资料:
    深复制与浅复制解析

    相关文章

      网友评论

          本文标题:深复制与浅复制

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