对于copy和strong的区别主要就是能区分深拷贝还是浅拷贝。
以字符串为例:

@property (retain,nonatomic) NSString *secondString;
@property (copy, nonatomic)   NSString *thirdString;- (void)test
{NSMutableString *firstString = [NSMutableString stringWithFormat:@"hello"];self.secondString   = firstString;self.thirdString    = firstString;NSLog(@"firstString:%p,%p",  firstString,&firstString);NSLog(@"secondString:%p,%p", _secondString, &_secondString);NSLog(@"thirdString:%p,%p",   _thirdString, &_thirdString);
}结果输出
2016-08-23 17:16:36.806 Test[2842:464972] firstString:0x7fec7580b7d0,0x7fff5b66ca48
2016-08-23 17:16:36.806 Test[2842:464972] secondString:0x7fec7580b7d0,0x7fec734d8810
2016-08-23 17:16:36.806 Test[2842:464972] thirdString:0xa00006f6c6c65685,0x7fec734d8818

可以从结果看出
firstString对象的地址为0x7fec7580b7d0,也就是0x7fec7580b7d0是@“hello”的首地址,mStr变量自身在内存中的地址为0x7fff5b66ca48;
当把firstString赋值给retain的secondString时,secondString对象的地址为0x7fec7580b7d0,rStr变量自身在内存中的地址为0x7fec734d8810;firstString与secondString指向同样的地址,他们指向的是同一个对象@“hello”,这个对象的地址为0x7fec7580b7d0,所以他们的值是一样的。
当把firstString赋值给copy的thirdString时,thirdString对象的地址为0xa00006f6c6c65685,thirdString变量自身在内存中的地址0x7fec734d8818;thirdString与firstString指向的地址是不一样的,他们指向的是不同的对象,所以copy是深复制,一个新的对象,这个对象的地址为0xa00006f6c6c65685,值为@“hello”。

增加如下代码:

   [firstString appendString:@"ddd"];NSLog(@"secondString:%@",_secondString);NSLog(@"thirdString:%@",_thirdString);输出
2016-08-23 17:29:17.748 ECIphoneTest[3021:472901] secondString:helloddd
2016-08-23 17:29:17.748 ECIphoneTest[3021:472901] thirdString:hello

可见浅复制跟随改变,但是深复制没有改变。

对于将nesting赋值给copy和retain同理。

得出结论:
对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。

对源头是NSString的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。

另外说明一下,这两者对内存计数的影响都是一样的,都会增加内存引用计数,都需要在最后的时候做处理。

简单来说比如声明的一个NSString *secondString变量,然后把一个NSMutableString *firstString变量的赋值给它了,如果要求secondString跟着firstString变化,那么就用retain;如果secondString不能跟着firstString一起变化,那就用copy。而对于要把NSString类型的字符串赋值给secondString,那两都没啥区别。不会影响安全性,内存管理也一样。

copy和strong的区别相关推荐

  1. iOS属性之assign,copy,retain的区别以及weak和strong的区别

    为什么80%的码农都做不了架构师?>>>    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retai ...

  2. assign, retain, copy, weak, strong

    一.assign, retain, copy 的区别(引用计数 RC reference count) 参考:IOS基础:retain,copy,assign及autorelease 1. 假设你用m ...

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

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

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

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

  5. Copy 与MutableCopy的区别

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

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

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

  7. retain和copy还有assign的区别

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

  8. copy与mutableCopy的区别总结

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

  9. [html] title与h1的区别、b与strong的区别、i与em的区别?

    [html] title与h1的区别.b与strong的区别.i与em的区别? title 是 网页标题标签 h1 是文本标签 默认与word的h1相似为最大的标题显示 b 为文本加粗标签 与word ...

  10. c语言assign用法,object-c语言的nonatomic,assign,copy,retain的区别

    nonatomic: 非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写 ...

最新文章

  1. 开发打开设置洁面_用华为手机,这4个功能一定要打开,不然你的手机只会越用越卡!...
  2. RTT设备与驱动之I2C:
  3. Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)的解决办法
  4. Python实现进度条总结
  5. ajax隐藏button,jquery下的ajax应用-form和button触发
  6. [GAE教程]初识 Google App Engine
  7. sigquit信号默认忽略吗_linux下的信号列表
  8. python学籍管理系统 flask_taskday05-Python之flask学习 web开发最基本的需要(特别详细且适用)...
  9. SQL Server索引简介:SQL Server索引级别1
  10. VC++_2010_学习版_未能下载以下组件解决方案和microsoft应用程序错误报告
  11. [维修案例] 艾美特电风扇(FS4085R)不能调风量维修
  12. windows下远程连接Mysql
  13. 台币 日元 没有小数位问题_SAP刘梦_新浪博客
  14. emlog某涛娱乐资源网源码 自带200多条数据打包
  15. INCREMENTAL NETWORK QUANTIZATION: TOWARDS LOSSLESS CNNS WITH LOW-PRECISION WEIGHTS
  16. php 判断字符串乱码,php如何检测乱码字符
  17. window server2008下安装VS.NET2008
  18. SQL Prompt 4试用
  19. 【docker】docker介绍
  20. squid回源延迟读

热门文章

  1. 报错 | Cannot find module ‘@better-scroll/core/dist/types/BScroll‘
  2. 计算机和交换机组建步骤,win7系统使用交换机组建局域网的详细步骤
  3. 机器学习周刊第二期:深度学习上了Nature
  4. y53拆机视频教程_戴尔笔记本P35G拆机全过程图解
  5. python网络爬虫课程设计报告摘要_课程设计 Python 网络爬虫(广度优先方法)
  6. 耦合器滤波器衰减器无源器件自动化测试软件系统,纳米NSAT-1000
  7. 神经网络处理器异构加速,神经网络处理器的特点
  8. 视频教程-Visio应用视频教程(上)-Office/WPS
  9. python绘制中国省界地图_利用python绘制中国地图(含省界、河流等)
  10. php写猴子搬香蕉问题,世界500强企业面试题:猴子吃香蕉