对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢?

  这里有个例子,一.首先声明2个属性:

@property (nonatomic,copy) NSString *CopyName;

@property (nonatomic,strong) NSString * StrongName;

  1.1.创建一个可变字符串,方面后面作变化更改。

 NSMutableString*  MutableName = [NSMutableString stringWithFormat:@"abc"];

  1.2.把MutableName赋值给属性

self.CopyName =MutableName;
self.StrongName = MutableName;

  1.3.把结果打印下:

 NSLog(@"变化前.Copyname=%@\nStrongname=%@",self.CopyName,self.StrongName);
NSLog(@"%p,%p,%p",MutableName,self.CopyName,self.StrongName);

  打印结果如下:

变化前.Copyname=abc    Strongname=abc
0x7fdc32d346a0,0xa000000006362613,0x7fdc32d346a0

发现用copy修饰其实是个深拷贝,拷贝了一块新的空间,里面存了相同的内容。

  1.4.更改MutableName的值,再打印结果

[MutableName appendString:@"def"];
NSLog(@"变化后.Copyname=%@\nStrongname=%@",self.CopyName,self.StrongName);

  结果如下:

变化后.Copyname=abc    Strongname=abcdef

  这个结果也就不难解释了。strong修饰的StrongName和MutableName指向的是同一块空间,当更改MutableName指向的内容时,StrongName获取的值当然也会改变了。而copy修饰的CopyName指向的是另一块空间,更改MutableName指向的内容时,对它没有影响。

  2.1创建一个不可变的字符串,并赋值给2个属性

   NSString *name =@"abc";
self.CopyName =name;
self.StrongName = name;

  2.2打印结果

   NSLog(@"变化前.Copyname=%@\nStrongname=%@",self.CopyName,self.StrongName);
NSLog(@"%p,%p,%p",name,self.CopyName,self.StrongName);

  结果如下:

变化前.Copyname=abc    Strongname=abc

  0x10695e0f0,0x10695e0f0,0x10695e0f0

  发现这次的结果跟上一次有点不一样了,这次的copy实际上是浅拷贝,只是拷贝了地址,并没有开辟新的空间。

  所以在属性指向不可变的String类型的对象时,用copy和strong修饰没有什么区别。

  而在属性指向可变的MutableString类型时,你期望属性随MutableString的值变化而变化的时候就用strong,反之用copy。数组,字典同理。其实这就涉及到了数据的安全性问题。

  

IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?的更多相关文章

  1. iOS之NSString类型为什么要用copy修饰

    在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是N ...

  2. Objc中为何某些类的属性要设置为copy而不是strong?

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 不知道大家是否注意,我们再使用一些第三方类的时候大多数情况下对 ...

  3. 【转】NSString属性什么时候用copy,什么时候用strong?

    原文网址:http://www.cocoachina.com/ios/20150512/11805.html 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境) ...

  4. NSString属性什么时候用copy,什么时候用strong?【转】

    转自:http://www.cocoachina.com/ios/20150512/11805.html. 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境): ...

  5. NSString属性什么时候用copy,什么时候用strong?

           我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢 ...

  6. iOS开发UI篇—transframe属性(形变)

    iOS开发UI篇—transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...

  7. IOS开发UI基础UILabel属性

    UILabel属性 1.text:设置标签显示的文本. 2.attributedText:设置标签属性文本. Ios代码 NSString *text = @"first";  N ...

  8. 李洪强iOS开发Swift篇—09_属性

    李洪强iOS开发Swift篇—09_属性 一.类的定义 Swift与Objective-C定义类的区别 Objective-C:一般需要2个文件,1个.h声明文件和1个.m实现文件 Swift:只需要 ...

  9. 使用MUI的日期控件引起的探索——HTML5 input类型date属性

    我写移动端的页面会用到MUI这个框架,个人觉得挺好用的,有很多实用的UI组件.当然坑还是有的,http://dev.dcloud.net.cn/mui/ui/ MUI官网,有兴趣的小伙伴可以看看 虽然 ...

随机推荐

  1. sq楼盘信息

    Sq楼盘信息 1.1按关注度来分 前10个 序号 楼盘 网址 价格 关注人数 地址 附件社区 1 上海公馆 http://shangqiu.jiwu.com/loupan/236459.html 38 ...

  2. Spark机器学习示例

    1. Java代码 /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor lice ...

  3. bzoj3600: 没有人的算术

    题意:太难说了..手动去看吧反正不是权限题. 膜拜VFK大爷的神题! 其实一开始思路挺清楚的,如果我们能做到用一个实数去代表"数",这就是裸的动态区间最值查询. 关键是怎么用实数去 ...

  4. collectionview cell吸顶效果

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Hiragino Sans GB"; color: #cf8724 } ...

  5. Python 面向对象[Day 06]

     面向对象编程(Object-Oriented Programming)  概述 面向过程:根据业务逻辑从上至下写代码,实现所需功能. 函数式:将某些功能代码封装至函数中,在需要时调用函数,函数式代码 ...

  6. C++小项目:directx11图形程序(七):modelclass

    模型类是世界空间中的表示物体的类,那么他的所做的事就是加载模型,移动模型,渲染模型 modelclass.h #pragma once #include <d3d11.h> #includ ...

  7. open nms安装教程

    而在正式的任务,我被要求在Windows平台上部署开源网络管理系统.虽然工作的任务,我得到了一些问题,对此我无法在网上寻找解决的问题,我用的命中和试验方法得到了解决.然后我想就这些问题及其解决办法写. ...

  8. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  9. ubuntu关于apache服务命令

    一.Start Apache 2 Server /启动apache服务 # /etc/init.d/apache2 startor$ sudo /etc/init.d/apache2 start 二. ...

  10. UliPad ----python 开发利器

    安装wxPython                                                                                          ...