IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?
对于很多初学者,发现在修饰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呢?的更多相关文章
- iOS之NSString类型为什么要用copy修饰
在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是N ...
- Objc中为何某些类的属性要设置为copy而不是strong?
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 不知道大家是否注意,我们再使用一些第三方类的时候大多数情况下对 ...
- 【转】NSString属性什么时候用copy,什么时候用strong?
原文网址:http://www.cocoachina.com/ios/20150512/11805.html 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境) ...
- NSString属性什么时候用copy,什么时候用strong?【转】
转自:http://www.cocoachina.com/ios/20150512/11805.html. 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境): ...
- NSString属性什么时候用copy,什么时候用strong?
我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢 ...
- iOS开发UI篇—transframe属性(形变)
iOS开发UI篇—transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...
- IOS开发UI基础UILabel属性
UILabel属性 1.text:设置标签显示的文本. 2.attributedText:设置标签属性文本. Ios代码 NSString *text = @"first"; N ...
- 李洪强iOS开发Swift篇—09_属性
李洪强iOS开发Swift篇—09_属性 一.类的定义 Swift与Objective-C定义类的区别 Objective-C:一般需要2个文件,1个.h声明文件和1个.m实现文件 Swift:只需要 ...
- 使用MUI的日期控件引起的探索——HTML5 input类型date属性
我写移动端的页面会用到MUI这个框架,个人觉得挺好用的,有很多实用的UI组件.当然坑还是有的,http://dev.dcloud.net.cn/mui/ui/ MUI官网,有兴趣的小伙伴可以看看 虽然 ...
随机推荐
- CSSOM视图模式(CSSOM View Module)相关整理:scrollWidth,scrollLeft,offsetLeft,clientX ,offsetX 定义和区别
转:http://www.zhangxinxu.com/wordpress/2011/09/cssom%E8%A7%86%E5%9B%BE%E6%A8%A1%E5%BC%8Fcssom-view-mo ...
- Mongodb插入记录
Mongodb下文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 MongoDB ...
- css3选择器详解
css中除了早先最早的,ID选择器,class选择器一些以外在css3中新加入了新的选择器,新选择器的使用大大的方便了我们的编程,下面我就说一些css3的选择器的使用方法, p 选择了所有 ...
- iOS多线程中performSelector: 和dispatch_time的不同
iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有 ...
- 【Python②】python之首秀
第一个python程序 再次说明:后面所有代码均为Python 3.3.2版本(运行环境:Windows7)编写. 安装配置好python后,我们先来写第一个python程序.打开IDLE (P ...
- Cannot send session cache limiter Cannot modify header information
当php报出 Cannot send session cache limiter 或Cannot modify header information 的错误时 其理论上是因为php代码以前有 ...
- Making the Grade(POJ3666)
题目大意: 给出长度为n的整数数列,每次可以将一个数加1或者减1,最少要多少次可以将其变成单调增或者单调减(不严格). 题解: 1.一开始我有一个猜想,就是不管怎么改变,最终的所有数都是原来的某个数. ...
- Android中ActionBar的使用
简介 从Android3.0开始(targetSdkVersion或者minSdkVersion为11或者更高),ActionBar被包括在了所有主题为Theme.holo(或者子类)的主题当中. 使 ...
- 面试复习(C++)之堆排序
#include <iostream> using namespace std; void Maxheap(int *a,int i,int heapSize)//最大数调整 { +;// ...
- 初始化git远程仓库步骤
Git global setup git config --global user.name "bingo" git config --global user.email &quo ...