[OC] @property时,copy、strong、weak、assign的区别
@property(copy,nonatomic)NSMutableString*copyStr;
@property(strong,nonatomic)NSMutableString*strongStr;
@property(weak,nonatomic)NSMutableString*weakStr;
@property(assign,nonatomic)NSMutableString*assignStr; NSMutableString* originStr = [[NSMutableStringalloc]initWithString:@"Hello_reality"]; self.aCopyMStr = originStr;
self.strongMStr = originStr;
self.weakMStr = originStr; NSLog(@"mstrOrigin输出:%p,%@ ", originStr, originStr);
NSLog(@"aCopyMStr输出:%p,%@ ",_copyStr, _copyMStr);
NSLog(@"strongMStr输出:%p,%@ ",_strongStr, _strongStr);
NSLog(@"weakMStr输出:%p,%@ ",_weakStr, _weakStr);
NSLog(@"引用计数%@",[originStr valueForKey:@"retainCount"]); //输出结果
//2016-09-01 15:19:13.134 lbCopy[1205:87583] mstrOrigin 输出:0x7892a5e0,Hello_reality
//2016-09-01 15:19:13.135 lbCopy[1205:87583] aCopyMStr 输出:0x7893deb0,Hello_reality
//2016-09-01 15:19:13.135 lbCopy[1205:87583] strongMStr 输出:0x7892a5e0,Hello_reality
//2016-09-01 15:19:13.135 lbCopy[1205:87583] weakMStr 输出:0x7892a5e0,Hello_reality
//2016-09-01 15:19:13.135 lbCopy[1205:87583] 引用计数2
只有copy会开拓新的内存地址,来保存数据。
strong和weak的指针指向的仍然是源字符串的内存地址。
那么造成的结果就是,对源字符串的修改也会造成strongStr和weakStr的内容变化,但是对copyStr没有影响。
而strong和weak的区别在于,strong会使originStr的引用计数+1,但weak不会。
ARC之前属性构造器的关键字是retain,copy,assign,strong和weak是ARC带出来的关键字。
retain现在同strong,就是指针指向值地址,同时进行引用计数加1。
结论:copy会重新开辟新的内存来保存一份相同的数据。被赋值对象和原值修改互不影响。strong和weak虽然都指向原来数据地址,原值修改的时候storng和weak会随之变化。区别是前者会对数据地址进行引用计数+1防止原地址值被释放,但后者不会,当其他值都不在指向值地址时,值地址被释放,weak的值也就是为nil了。我们称会对数据地址增加引用计数的为强引用,不改变引用计数的为弱引用。
注:初始化和设为nil都可以将指针所指向的数据地址引用计数减少1。
[OC] @property时,copy、strong、weak、assign的区别的更多相关文章
- ios OC 关键字 copy,strong,weak,assign的区别
一.先介绍 copy.strong.weak 的区别,如代码所示 @property(copy,nonatomic)NSMutableString*aCopyMStr; @property(stron ...
- ios 内存管理与property copy strong weak assign
- (void)fun{ NSString* str = [[NSString alloc] initWithString:@"string"]; NSLog(@"% ...
- ios中strong, weak, assign, copy
copy 和 strong(retain) 区别 1. http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是 ...
- 对于atomic nonatomic assign retain copy strong weak的简单理解
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环 ...
- @property中的copy.strong.weak总结
1.NSString类型的属性为什么用copy NSString类型的属性可以用strong修饰,但会造成一些问题,请看下面代码 #import "ViewController.h" ...
- iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL
以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the non ...
- assign,copy,strong,weak,nonatomic的理解
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段 ...
- assign,copy,strong,weak,nonatomic的具体理解
例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段内存 ...
- ios copy/strong/weak..使用总结
总结 关于属性的这些选项的学习,做一下总结: 所有的属性,都尽可能使用nonatomic,以提高效率,除非真的有必要考虑线程安全. NSString:通常都使用copy,以得到新的内存分配,而不只是原 ...
随机推荐
- 初识dubbo
1. 为什么需要 Dubbo(摘自http://dubbo.apache.org/zh-cn/docs/user/quick-start.html) 随着互联网的发展,网站应用的规模不断扩大,常规的垂 ...
- LeetCode(108):将有序数组转换为二叉搜索树
Easy! 题目描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组 ...
- hdu6273 线性差分
#include<bits/stdc++.h> using namespace std; typedef long long LL; ; ; LL a[maxn],b[maxn]; LL ...
- Vue-CLI 3.x 设置反向代理
最近在项目中使用了Vue CLI 3.0版本,项目中需要设置反向代理解决跨域问题,下面记录一下设置过程. 新建配置文件 (vue-cli3.x 官网的配置文档 https://cli.vuejs.or ...
- golang 打包,交叉编译,压缩
打包,压缩 我们的常规打包方式 $ go build Mac下我们用 ls -lh查看,可以看到我们打包出来的可执行文件会比较大,一般只写几行代码就回又3M以上的文件大小了. 我们的带压缩的打包方式 ...
- SpringMVC 框架完成图片上传到项目路径操作
/** * 保存添加 * * @return */ @RequestMapping(value = "taizhang/add.action", method = { Reques ...
- 51 Nod 1079 中国剩余定理(孙子定理)NOTE:互质情况
1079 中国剩余定理 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % 2 = 1, K % 3 = 2, K % 5 = 3.符合条件的最小的K = 23. 收起 ...
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- Python数据分析几个比较常用的方法
1,表头或是excel的索引如果是中文的话,输出会出错 解决方法:python的版本问题!换成python3就自动解决了!当然也有其他的方法,这里就不再深究 2,如果有很多列,如何输出指定的列? ...
- Django-model聚合查询与分组查询
Django-model聚合查询与分组查询 聚合函数包含:SUM AVG MIN MAX COUNT 聚合函数可以单独使用,不一定要和分组配合使用:不过聚合函数一般和group by 搭配使用 agg ...