内存管理之copy

iOS提供了2个拷贝方法
1.copy,不可变拷贝,产生不可变副本
2.mutableCopy,可变拷贝,产生可变副本

深拷贝和浅拷贝
1.深拷贝:内容拷贝,产生新的对象
2.浅拷贝:指针拷贝,没有产生新的对象

NSString *str1 = [[NSString alloc] initWithFormat:@"test"];
NSString *str2 = [str1 copy];  // 返回的是NSString, 浅拷贝,指针拷贝,没有产生新对象
NSMutableString *str3 = [str1 mutableCopy];//返回的是NSMutableString,深拷贝,内容拷贝,有产生新对象
NSLog(@"%@ %@ %@", str1, str2, str3);
NSLog(@"%p %p %p", str1, str2, str3);
深拷贝、浅拷贝.png

注释:因为str1是不可变对象,[str1 copy] 返回str2也是不可变对象,两指针指向了同一块内存地址,所以是浅拷贝,[str1 mutableCopy]返回str3是可变对象,如果str3改变,不影响str1,就需要申请一块新的内存地址,所以str1、str3指针指向了不同的内存址,是深拷贝

NSMutableString *str1 = [[NSMutableString alloc] initWithFormat:@"test"];
NSString *str2 = [str1 copy]; // 深拷贝
NSMutableString *str3 = [str1 mutableCopy]; // 深拷贝

深拷贝、浅拷贝.png

注释:因为str1是可变对象,[str1 copy] 返回str2是不可变对象,如果str1改变,不影响str2,就需要申请一块新的内存地址,所以str1、str2指针指向了不同的内存址,是深拷贝,[str1 mutableCopy]返回str3是可变对象,如果str3改变,不影响str1,就需要申请一块新的内存地址,所以str1、str3指针指向了不同的内存址,是深拷贝

copy和mutableCopy

copy和mutableCopy.png

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 面试题引发的思考: Q: 谈一谈对copy、mutableCopy、浅拷贝、深拷贝的理解? copy:不可变拷贝,...
    hazydream阅读 723评论 1 0
  • 本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...
    水中的蓝天阅读 401评论 0 3
  • 一. copy(不可变拷贝)、mutableCopy(可变拷贝) copy就是拷贝, 拷贝的目的:产生一个副本对象...
    Imkata阅读 418评论 0 0
  • Copy的目的 copy的目的,是希望能产生一个同样的副本。希望修改副本的时候,不会影响到原来的数据。修改原来的数...
    嗯o哼阅读 349评论 0 1
  • Copy 拷贝的目的:产生一个副本对象,跟源对象互不影响,修改了源对象,不会影响副本对象,修改了副本对象,不会影响...
    YanZi_33阅读 595评论 0 0