美文网首页
iOS 深拷贝及浅拷贝的区别

iOS 深拷贝及浅拷贝的区别

作者: ninazhang | 来源:发表于2017-04-25 11:52 被阅读0次

一、浅拷贝及深拷贝

1、浅拷贝(指针copy)

1)相当于对指向对象的指针进行复制,产生一个新的指向对象的指针;

2)就有两个指针指向同一个对象;

3)这个对象销毁后,两个指针都应置空;

4)对象引用计数+1

2、深拷贝(内容copy)

深copy不仅会复制对象本身,而且会递归复制每个指针类型的实例变量,直到两个对象没有任何公共的部分。

1)相当于对对象进行复制,产生一个新的对象;

2)就有两个指针分别指向两个对象;

3)当其中一个对象改变或者销毁后,另一个对象不受影响;

4)源对象引用计数不变,副本计数器设置为1

二、copy及mutableCopy

    NSObject类提供了copy和mutableCopy方法,通过这两个方法即可复制已有对象的副本

     NSString,NSMUtablestring等系统类默认遵守NSCoppying及NSMUtableCoppying协议。

     只有不可变对象创建的不可变副本(copy)才是浅copy,其它都是深copy。

1、copy方法

1)只要调用copy方法,总是返回对象的不可修改的副本。即便该对象本身是可修改的

2)eg: 调用NSMUtableString的copy方法,将返回不可修改的字符串对象。

2、mutableCopy方法

1)只要调用mutableCopy方法,总是返回对象的可变副本。即便该对象本身是不可修改的。

2)eg: 调用NSString的mutableCopy方法,总是返回对象的可修改的字符串对象。

3、示例代码

4、系统对象总结

1、对于系统的非容器类对象(eg:NSString,NSMUtableString)

如果对[不可变]对象复制,copy是指针复制(浅拷贝), mutableCopy就是对象复制(深拷贝)。

如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。

2、对于系统的容器类对象(eg:NSArray ,NSDictionary)

对于容器类本身,上面讨论的结论也是适用的,只不过是容器对象中的元素是是浅copy。

5、自定义类调用copy与mutableCopy复制对象的副本

声明协议 重写方法 调用

6、setter方法的copy选项

1)copy指示符就是指定当前程序调用setter方法复制时,实际上是将传入参数的副本赋值给程序的实例变量。(通过点语法赋值时,实际上调用的就是setter方法)

相关文章

  • iOS 深浅拷贝

    iOS深拷贝与浅拷贝的区别 深拷贝与浅拷贝的概念:(我的理解,望不吝赐教) 浅拷贝:只copy一份对象的指针,指向...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 深拷贝和浅拷贝

    干货!深拷贝和浅拷贝的区别 深拷贝才是拷贝,浅拷贝就是Retain Copy与Retain的区别 Copy: 根据...

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • 深拷贝和浅拷贝

    1: iOS开发 深拷贝与浅拷贝 2: iOS 浅谈:深.浅拷贝与copy.strong 3: iOS开发——深...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解iOS ...

  • iOS 图文并茂的带你了解深拷贝与浅拷贝

    iOS 图文并茂的带你了解深拷贝与浅拷贝 iOS 图文并茂的带你了解深拷贝与浅拷贝

  • 深拷贝和浅拷贝

    1.深拷贝:地址的拷贝 2.浅拷贝:是值得拷贝 深拷贝和浅拷贝的区别 A拷贝B B变A变是浅拷贝 A拷贝B B变A...

  • python的浅拷贝和深拷贝

    对于不可变类型,浅拷贝和深拷贝没有区别 对于不可变类型 赋值 浅拷贝 深拷贝

网友评论

      本文标题:iOS 深拷贝及浅拷贝的区别

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