
深拷贝、浅拷贝的理解与使用场景
1个回答
展开全部
通俗解释:深拷贝是内容拷贝,浅拷贝是地址拷贝
区别点:
深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样。
浅拷贝只是拷贝指向原来对象的地址,使原对象的引用计数+1
像NSString、NSNumber这些不能包含其他对象的叫做非容器类对象
像NSArray、NSDictionary这些可以包含其他对象的叫容器类对象
打印结果如下:
通过对比不难发现:
上面我们使用的是不可变的NSString,下面我们再使用可变的NSMutableString对比一下:
打印结果如下:
不难发现,对于NSMutableString, 无论是copy还是mutableCopy都会创建一个新对象,属于深拷贝
打印结果如下:
不难发现,copy是浅拷贝,mutableCopy是深拷贝,不过需要注意的是容器对象的成员元素都指向相同的地址
打印结果如下:
对比可见,容器对象与非容器对象类似,可变对象的复制都是深拷贝,不可变对象copy是浅拷贝,mutableCopy是深拷贝
需要注意的是对容器而言,元素对象始终是指针复制
正如前面所说,容器对象中的元素对象无论是copy还是mutableCopy都是指针复制,如何实现容器对象的完全深拷贝呢?
系统为我们实现容器对象的完全深拷贝提供了方法
区别点:
深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样。
浅拷贝只是拷贝指向原来对象的地址,使原对象的引用计数+1
像NSString、NSNumber这些不能包含其他对象的叫做非容器类对象
像NSArray、NSDictionary这些可以包含其他对象的叫容器类对象
打印结果如下:
通过对比不难发现:
上面我们使用的是不可变的NSString,下面我们再使用可变的NSMutableString对比一下:
打印结果如下:
不难发现,对于NSMutableString, 无论是copy还是mutableCopy都会创建一个新对象,属于深拷贝
打印结果如下:
不难发现,copy是浅拷贝,mutableCopy是深拷贝,不过需要注意的是容器对象的成员元素都指向相同的地址
打印结果如下:
对比可见,容器对象与非容器对象类似,可变对象的复制都是深拷贝,不可变对象copy是浅拷贝,mutableCopy是深拷贝
需要注意的是对容器而言,元素对象始终是指针复制
正如前面所说,容器对象中的元素对象无论是copy还是mutableCopy都是指针复制,如何实现容器对象的完全深拷贝呢?
系统为我们实现容器对象的完全深拷贝提供了方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询