1.字符串拷贝

copy 浅拷贝,不拷贝对象本身,仅仅是拷贝指向对象的指针。

     NSString *str1 = @"qqq";NSString *str2 = [str1 copy];NSLog(@"\nstr1 = %@ str1P = %p \n str2 = %@ str2P = %p", str1, str1, str2, str2);
//运行结果
str1 = qqq str1P = 0x101d54100 str2 = qqq str2P = 0x101d54100

str1 = @"sss";

NSLog(@"%@---%@----%p---%p",str1,str2,str1,str2);

//运行结果  sss---qqq----0x1080a4140---0x1080a4100

那为什么NSString *str2 = [str1 copy];是不同的指针指向同一块内存空间,str1 从新赋值 后两个内存空间就不一样了呢?

因为str2 = str1的时候,两个字符串都是不可变的,指向的同一块内存空间中的 @"str1",是不可能变成@"abcd"的。所以这个时候,为了优化性能,系统没必要另外提供内存,只生成另外一个指针,指向同一块内存空间就行。
但是当你从新给 str1 或者str2赋值的时候,因为之前的内容不可变,还有互不影响的原则下,这个时候,系统会从新开辟一块内存空间。

NSMutableString *mstr1 = [[NSMutableString alloc]initWithString:@"123"];

NSMutableString *mstr2 = [mstr1 copy];

NSLog(@"%@---%@--%p---%p",mstr1,mstr2,mstr1,mstr2);

NSMutableString *mstr3 = [mstr1 mutableCopy];

NSLog(@"%@---%p",mstr3,mstr3);

copy 和 mutableCopy   当 immtable 对象调用copy方法 返回的是 immtable对象   immtable 调用 mutablecopy返回 mutable


2.相对数组而言

@property (nonatomic, copy) NSMutableArray *mArr;

NSArray *arr = @[@"123", @"456", @"asd"];

self.mArr = [arr mutableCopy];

NSLog(@"\n arrP = %p \n self.mArrP = %p, self.mArr class = %@", arr, self.mArr, [self.mArr class]);

可以看出内存地址不一样,但是_mArr 是不可变的数组。
因为 _mArr声明的时候是用 copy修饰,那么就限制了他为不可变的数组。 赋值的时候是用mutableCopy,可变数组的复制方法,所以会从新分配内存。

//运行结果

arrP = 0x600003a6ebb0 

 self.mArrP = 0x600003a6eb20, self.mArr class = __NSArrayI

  • 用copy修饰的 或者赋值的 变量肯定是不可变的。
  • 用copy赋值,要看源对象是否是可变的,来决定只拷贝指针,还是也拷贝对象到另一块内存空间
  • 对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一块内存中
  • 对象之间赋值之后,再改变,遵循互不影响的原则

copy 和 mutableCopy的区别相关推荐

  1. Copy 与MutableCopy的区别

    NSString *string = @"origion"; NSString *stringCopy = [string copy]; NSMutableString *stri ...

  2. copy与mutableCopy的区别总结

    1.不可变类型(不管是集合还是非集合),copy结果,不产生新对象,浅拷贝: 不可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝. 2.可变类型(不管是集合还是非集合) ...

  3. iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

    依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内 ...

  4. object-c语言的nonatomic,assign,copy,retain的区别

    nonatomic: 非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问.                     (atomic是Objc使用的 ...

  5. copy模块中的copy与deepcopy的区别

    前言 每空闲下来,就觉得以前写的博客很low........也许现在也很low~~~~好吧就当升级版的low吧~~~~ 如果要了解copy与deepcopy的区别,就需要了解Python的存储机制:P ...

  6. nonatomic,assign,copy,retain的区别

    nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问.                     (atomic是Objc使用的一 ...

  7. [Objective-C] Copy 和 MutableCopy

    看了几篇文章,因为文章很新手向,所以内容很繁琐.故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念.新博客wossoneri.com传送门 非集合类对象的copy与mutableCopy / ...

  8. retain和copy还有assign的区别

    retain和copy还有assign的区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a和b ...

  9. strong、copy和mutableCopy详解

    写在前面 关于copy.mutableCopy和strong,一直想好好整理整理,但是因为各种原因搁置了.今天上班时发现老代码中因为这个问题出现了一个特别恶心的大坑,让我下定决心写下这篇博文.如果你认 ...

最新文章

  1. Varnish使用小结
  2. shuffleNetv2 测试
  3. Python常用模块之sys模块
  4. VTK:Qt之ImageDataToQImage
  5. ECMAScript 2019(ES10)新特性简介
  6. 德国同事Heiko开发的ABAP工具,能检测HANA数据库执行SQL的CPU time
  7. react开发_我如何在#100DaysOfCode挑战期间找到React开发人员的工作
  8. PHP代码规范[转]
  9. mongodb常用语句(集合操作)
  10. kali linux引导文件修复,Kali+Windows引导修复
  11. charset参数 sqluldr2_sqluldr2使用几例
  12. 软考高项 : (27)信息系统项目管理师模拟试题
  13. surface pro win10 重装系统并解决屏幕亮度闪烁和降频的问题
  14. CBOW(Continous Bag of Words)模型学习(2020-08-19)
  15. AQS(AbstractQueuedSynchronizer)同步器
  16. ubuntu出现有线已连接却无法上网的解决方法(ubuntu连不上网)
  17. c++工作宝贵经验呀,我去。。。。
  18. 群晖|半洗白后moments正常显示人像、主题、预览
  19. 叮! Q币派送中,快来看看你中奖了吗?
  20. 穷不是中年危机的理由

热门文章

  1. CSS outline
  2. Samsung手机验证
  3. 禅与摩托车维修艺术思想哲学
  4. 骑行应用开发《三》天气
  5. Android 身份注册系统
  6. YARN源码分析—AM-RM通信协议,获得资源
  7. php 让百度蜘蛛抓取403,百度蜘蛛不抓取页面的解决方法
  8. html如何设置方正仿宋,怎么在WPS中添加方正仿宋简体?
  9. 美的工业技术亮相2022汉诺威工业博览会,助力全球工业向数字化与可持续迈进
  10. 尚医通-预约下单中rabbitmq的使用