strong vs copy
2015-07-21 17:01
363 查看
一、前言
在这里,我通过实例去介绍strong和copy的区别(%p打印出来对象的地址)
ViewController.h
运行结果是:
而当我们把.h中的strong改成copy时,
运行结果是:
对比可以发现:
当我们使用strong时,myName对象和self.name的地址相同,说明两者指向的是同一个地址空间:0x7967f4c0
而当我们把.h中name的strong改成copy时,myName和self.name地址不同,说明两者指向的是不同的地址空间。
myName是:0x78deb9b0
self.name是:0x78dea270
这说明:当我们使用copy的时候表示拥有不同的存储空间,存放的是相同的内容。因此如果我们对myName进行修改,self.name是不会受到影响的。
在ARC情况下,如果源字符串是NSString时,由于字符串不可变,所以不管是strong还是copy属性的对象,都是指向源对象,copy只是进行了浅拷贝。
而如果源字符串是NSMutableString的话,strong是强引用,只是增加了源字符串的引用计数,而copy则是对源字符串进行了深拷贝,产生了一个新的对象,而且开辟了新的内存空间。此时如果我们修改源字符串的值,那么strong特性的字符串也会跟着修改,而copy的则不变。
* 大多情况下,建议使用copy,因为一般我们将对象声明为NSString时,都不希望它改变。
总结:
这里你应该学到:
1、strong和copy的区别
2、我们可以用%p打印出对象的地址。
在这里,我通过实例去介绍strong和copy的区别(%p打印出来对象的地址)
ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property(nonatomic,strong) NSString *name; @end ViewController.m - (void)viewDidLoad { [super viewDidLoad]; NSMutableString *myName = [NSMutableString stringWithString:@"zhangsan"]; self.name = myName; NSLog(@"myName's address:%p",myName); NSLog(@"self.name's address:%p",self.name); }
运行结果是:
2015-07-21 16:38:50.911 Test[4369:2323491] myName's address:0x7967f4c0 2015-07-21 16:38:50.912 Test[4369:2323491] self.name's address:0x7967f4c0
而当我们把.h中的strong改成copy时,
@property(nonatomic,copy) NSString *name;
运行结果是:
2015-07-21 16:40:09.938 Test[4394:2330879] myName's address:0x78deb9b0 2015-07-21 16:40:09.938 Test[4394:2330879] self.name's address:0x78dea270
对比可以发现:
当我们使用strong时,myName对象和self.name的地址相同,说明两者指向的是同一个地址空间:0x7967f4c0
而当我们把.h中name的strong改成copy时,myName和self.name地址不同,说明两者指向的是不同的地址空间。
myName是:0x78deb9b0
self.name是:0x78dea270
这说明:当我们使用copy的时候表示拥有不同的存储空间,存放的是相同的内容。因此如果我们对myName进行修改,self.name是不会受到影响的。
在ARC情况下,如果源字符串是NSString时,由于字符串不可变,所以不管是strong还是copy属性的对象,都是指向源对象,copy只是进行了浅拷贝。
而如果源字符串是NSMutableString的话,strong是强引用,只是增加了源字符串的引用计数,而copy则是对源字符串进行了深拷贝,产生了一个新的对象,而且开辟了新的内存空间。此时如果我们修改源字符串的值,那么strong特性的字符串也会跟着修改,而copy的则不变。
* 大多情况下,建议使用copy,因为一般我们将对象声明为NSString时,都不希望它改变。
总结:
这里你应该学到:
1、strong和copy的区别
2、我们可以用%p打印出对象的地址。
相关文章推荐
- 利用xshell密钥管理服务器远程登录+VIM dd命令操作之伤之再伤
- xampp 修改端口Apache端口方法
- nginx 下 ~ seo ~ ip canonicalization 解决
- linux性能监控基础命令
- linux nginx编译安装以及虚拟主机的配置
- C++实现Linux下弹出U盘的方法
- Ubuntu 14.10 下Hadoop FTP文件上传配置
- linux blkid
- GetOpenFilaName() 控制台程序选择框始终显示在windows最前
- shell中curl 用户详解
- 读Properties文件和往Properties文件里面写内容
- Linux jdk安装
- synopsys DC
- iOS工程自动打包 (Shell脚本打包)
- IIS网站调用FFMPEG执行截图命令失败的原因(暂时记录)
- 解决nginx不支持thinkphp中pathinfo的问题
- LINUX 下时间转换为秒数
- Linux监控本机当前状态命令
- rickyyu学FPGA——ISE在线调试过程中通过chipscope抓取不到相关信号怎么办?
- apache+php5+sqlite3移植