美文网首页
iOS-copy/mutableCopy、深复制/浅复制

iOS-copy/mutableCopy、深复制/浅复制

作者: 肉肉要次肉 | 来源:发表于2018-07-11 15:46 被阅读7次

    copy/mutablecopy


    使用copy或者mutablecopy方法可以创建一个对象的副本

    copy:需要实现NSCoppying协议

    这些创建的是不可变副本(如:NSSting、NSArray、NSDictionary)

    实现方法:copywithZone:

    mutablecopy:需要实现NSMutablecopying协议

    创建的是可变副本(如:NSMutableString、NSMutableArray、NSMutableDictionary)

    实现方法:mutableCopyWithZone:

    copy/mutableCopy原则:修改新(旧)对象,不影响旧(新)对象

    例一:

    打印结果:

    分析:

    我们可以看到,两个对象的内容完全一样,但是地址的空间变了,说明开辟了一块新内存给副本

    例二:

    打印结果:

    分析:

    内容不同,对象地址不同,修改新(旧)对象,不影响旧(新)对象

    例三:

    打印结果:

    分析:

    使用copy关键字,产生了一个新的不可变的对象

    例四:

    打印结果:

    分析:

    两个对象的内存地址完全一样,所以系统并没有创建一个新对象

    总结:

    当我们对一个不可变对象(NSString类型)使用copy时,系统是不会产生一个新对象,因为原来的对象是不能修改的,拷贝出来的对象也是不能修改的,那么既然两个都不可以修改,所以这两个对象永远也不会影响到另一个对象


    深复制/浅复制


    深复制: 直接拷贝整个对象内存到另一块内存中

    内容拷贝,源对象和副本指向的是不同的两个对象,源对象引用计数不变,副本计数+1

    浅复制:拷贝指向对象的指针,而不是对象本身

    指针拷贝,源对象和副本指向的是同一个对象,对象的引用计数器+1

    深复制与浅复制关系

    注意:

    * 不可变对象:进行copy得到的是浅复制,进行mutableCopy得到的是深复制

    * 可变对象:无论进行copy还是mutableCopy都是深复制

    相关文章

      网友评论

          本文标题:iOS-copy/mutableCopy、深复制/浅复制

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