[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,以得到新的内存分配,而不只是原 ...
随机推荐
- swoole 简介
- cf949C 建模,SCC缩点
/* 给定n个数据中心,m份资料,每份资料在其中的两个中心备份,一天可供下载的时间是h小时 中心i在第hi小时需要维护,无法下载 现在要将一些中心的维护时间往后推1小时,使得任意时刻每份资料都可以被下 ...
- appium如何解决每次都要安装apk的烦恼
1.appium上勾选 No Reset 2.程序加上:capabilities.setCapability("noReset", true); //不需要再次安装 3.命令行 ...
- 专注笔试算法20年(C语言版)
1.C语言实现链表数据的反转({1,2,3,4}->{4,3,2,1}). int trav(PNode *head){ PNode p_1,p_2,tmp; //判断参数是否有效 if(*he ...
- Java+selenium之WebDriver常见特殊情况如iframe/弹窗处理(四)
1. iframe 的处理 查找元素必须在对应的 ifarme 中查找,否则是找不到的 // 传入参数为 frame 的序号,从0开始 driver.switchTo().frame(Int inde ...
- js基本类型和字符串的具体应用
变量 JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 'var' var a = 123; var b = 'asd'; //同时定义多个 ...
- 如何设置Navicat的显示字体与字体大小?
方法/步骤 打开Navicat 点击[工具]菜单,再选择[选项] 在[选项]界面,点击[外观]下的[字体] 设置网格字体和大小 设置编辑器字体和大小 设置命令列界面字体和大 ...
- Can't connect to X11 window server using 的问题,求解
在JVM中加入-Djava.awt.headless=true对于tomcat ,可以修改catalina.sh,加入:CATALINA_OPTS="$CATALINA_OPTS -Djav ...
- 使用docker部署.net core应用
CentOS 使用VS2017新建一个asp.net core项目 发布web应用程序 使用FTP工具,将程序文件copy到linux上 XShell连上linux并登陆 cd /CoreWebDem ...
- 使用Filter跟踪Asp.net MVC页面加载(转)
转载地址:http://www.cnblogs.com/JustRun1983/p/4027929.html 最近,客户一直反馈系统使用慢,有时候能够指出具体是哪个页面,有时候又只是笼统地反馈慢.这种 ...