2019独角兽企业重金招聘Python工程师标准>>>

copy为内容拷贝,retain为指针拷贝,NSMutableString为可变字符串,NSString为不可变字符串。

但并不表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。

"NSString *"这个数据类型代表一个NSString对象的指针,不是NSString对象本身。

"NSMutableString *"这个数据类型则是代表"NSMutableString"对象本身,这两者是有区别的。

这也是有的时候我们使用NSMutableString类型字符串时,要使用copy的原因,因为可能不想改变新的字符串时影响到旧的字符串的值。

不管是retain还是copy对于NSString来说都是浅拷贝,还是指向的之前的内存区域。

@property (retain, nonatomic) NSString *retainStr;
@property (copy, nonatomic)   NSString *copyStr;
@property (retain, nonatomic) NSMutableString *retainMStr;
@property (copy, nonatomic)   NSMutableString *copyMStr;
NSMutableString *mStr = [NSMutableString string];[mStr setString:@"我没变"];self.retainStr   = mStr;self.copyStr     = mStr;self.retainMStr = mStr;self.copyMStr   = mStr;NSLog(@"retainStr:%@",  self.retainStr);NSLog(@"copyStr:%@",    self.copyStr);NSLog(@"retainMStr:%@", self.retainMStr);NSLog(@"copyMStr:%@",   self.copyMStr);NSLog(@"\n");[mStr setString:@"我变了"];NSLog(@"retainStr:%@",  self.retainStr);NSLog(@"copyStr:%@",    self.copyStr);NSLog(@"retainMStr:%@", self.retainMStr);NSLog(@"copyMStr:%@",   self.copyMStr);NSLog(@"\n");NSString *str = @"我来了";//[[NSString alloc] initWithFormat:@"我来了"];//两种方式都一样。self.retainStr  = str;self.copyStr    = str;self.retainMStr = [str mutableCopy];self.copyMStr   = [str mutableCopy];NSLog(@"retainStr:%@",  self.retainStr);NSLog(@"copyStr:%@",    self.copyStr);NSLog(@"retainMStr:%@", self.retainMStr);NSLog(@"copyMStr:%@",   self.copyMStr);NSLog(@"\n");str =@"我走了";//[[NSStringalloc] initWithFormat:@"我走了"];//两种方式都一样NSLog(@"retainStr:%@",  self.retainStr);NSLog(@"copyStr:%@",    self.copyStr);NSLog(@"retainMStr:%@", self.retainMStr);NSLog(@"copyMStr:%@",   self.copyMStr);NSLog(@"\n");
//打印结果
2015-12-31 14:05:42.780 SXH[24228:1216731] retainStr:我没变
2015-12-31 14:05:43.312 SXH[24228:1216731] copyStr:我没变
2015-12-31 14:05:43.857 SXH[24228:1216731] retainMStr:我没变
2015-12-31 14:05:44.548 SXH[24228:1216731] copyMStr:我没变
2015-12-31 14:05:57.064 SXH[24228:1216731]
2015-12-31 14:06:17.624 SXH[24228:1216731] retainStr:我变了
2015-12-31 14:06:19.612 SXH[24228:1216731] copyStr:我没变
2015-12-31 14:06:24.666 SXH[24228:1216731] retainMStr:我变了
2015-12-31 14:06:27.213 SXH[24228:1216731] copyMStr:我没变
2015-12-31 14:06:29.316 SXH[24228:1216731]
2015-12-31 14:06:52.438 SXH[24228:1216731] retainStr:我来了
2015-12-31 14:06:52.962 SXH[24228:1216731] copyStr:我来了
2015-12-31 14:06:53.484 SXH[24228:1216731] retainMStr:我来了
2015-12-31 14:06:53.951 SXH[24228:1216731] copyMStr:我来了
2015-12-31 14:06:58.966 SXH[24228:1216731]
2015-12-31 14:07:53.086 SXH[24228:1216731] retainStr:我来了
2015-12-31 14:07:53.865 SXH[24228:1216731] copyStr:我来了
2015-12-31 14:07:54.383 SXH[24228:1216731] retainMStr:我来了
2015-12-31 14:07:54.964 SXH[24228:1216731] copyMStr:我来了

ps:

http://www.cnblogs.com/celestial/archive/2012/10/12/2721244.html

转载于:https://my.oschina.net/jack088/blog/595251

理解 retain 、copy 、NSMutableString 、NSString 的用法相关推荐

  1. assign/retain/copy各内存管理特性的差异

    MRC下各内存管理特性 assign特性 当数据类型为int.float等原生类型时,可以使用assign,否则可能导致内存泄露.例如当使用malloc分配了一块内存,并把它的地址赋值给了指针a,后来 ...

  2. retain copy(浅复制) mutablecopy (深复制)

    http://blog.csdn.net/xdrt81y/article/details/24331103 口诀: 1浅3深 NSArray copy (浅) 返回NSArray NSArray  m ...

  3. retain/copy/assign区别

    转自:http://blog.csdn.net/pjk1129/article/details/6457048#comments 在iphone程序中,属性合成中的retain/copy/assign ...

  4. (ios实战):retain,copy,assign及autorelease ,strong,weak

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

  5. assign, retain, copy, weak, strong

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

  6. 深入理解正则表达式环视的概念与用法

    在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的 ...

  7. 【C++】41. std::copy和assign的用法

    对于std::copy的用法,可以参考 https://blog.csdn.net/a_ran/article/details/17385911,我这里直接介绍对于std::vector来说std:: ...

  8. 02 理解==与Equals()的区别及用法 1214

    02 理解==与Equals()的区别及用法 01 02 03

  9. (转)NSString+NSMutableString+NSValue+NSAraay用法汇总

    //一.NSString //1.创建常量字符串.     NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. N ...

最新文章

  1. (转载)为什么欧美拿金牌不感谢祖国
  2. 显示point data的时均值注意事项
  3. C# 发邮件类可发送附件
  4. c++ 虚继承与继承的差异
  5. eclipse安装、使用hibernate插件方法
  6. java 读取svg元素_svg动态添加元素
  7. 使用Google Cloud Storage托管您的Maven工件
  8. Android开发学习笔记--一个有界面A+B的计算器
  9. 浮点型的数字如何进行range_连接型CRM | 渠道经销订货数字化转型,5大关键角色的如何应用...
  10. kali linux win10桌面,一键伪装成Win 10,Kali Linux 2019年最终版重磅功能预览
  11. Error:(list) object cannot be coerced to type 'double'的处理
  12. Linux服务器恢复删除数据
  13. CSS —— 选择器
  14. 全网最通俗易懂的「插屏广告」接入方法
  15. 计算机清理方法,电脑清理方法 电脑要如何清理
  16. java环境的配置——实现win10下双击直接运行jar文件
  17. Sublime Text 3 简体中文汉化包使用方法 ( 更新时间2019.03.20 )
  18. 520,冰河亲自整理的Git命令汇总升级版,悄悄努力,然后惊艳所有人(升级版)
  19. 响应式织梦模板日化食品零食类网站
  20. 解决小程序自定义底部菜单切换闪动

热门文章

  1. 520礼包 | 情感分析算法从原理到PaddlePaddle实战全解
  2. 《中国AI算力发展评估报告》发布!北京只能排第二,推理需求猛增
  3. 照片上的人出来了!云从3D人体重建登顶三项榜单,一张照片就能生成3D形象
  4. 无需搭建和训练模型,87行代码搞定文章摘要生成
  5. 昔日网瘾少年,现在用AI教你打守望先锋
  6. 特斯拉奔驰宝马沃尔沃团灭!安全的半自动驾驶?不存在的
  7. 原生JS实现简易转盘抽奖
  8. nginx 的 proxy_cache 缓存配置
  9. Rancher如何按计算资源调度
  10. web-ylbtech(合同管理)-数据库设计