Objective C assign© & retain区别
什么是assign,copy,retain之间的区别?
- assign: 简单赋值,不更改索引计数(Reference Counting)。
- copy: 建立一个索引计数为1的对象,然后释放旧对象
- retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
retain是指针拷贝,copy是内容拷贝
比如一个Car对象,地址为0×1111
Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
- (void)setName:(NSString *)newName {
if (name != newName) {
[name release];
name = [newName retain];
// name’s retain count has been bumped up by 1
}
}
对于NSString、NSDictianary等数据型是很特殊的,见下示例
NSLog(@”COPY retain 差异测试”);
NSString * t3 = [[NSString alloc] initWithFormat:@”%@”,@”t3″];
NSLog(@”变量t3=%@ count=%d 地址=%lx “,t3,[t3 retainCount],&t3);
NSLog(@”t4 COPY t3″);
NSString * t4 = [t3 copy];
NSString * t5 = t3;
NSLog(@”变量t3=%@ count=%d 地址=%lx “,t3,[t3 retainCount],&t3);
NSLog(@”变量t4=%@ count=%d 地址=%lx “,t4,[t4 retainCount],&t4);
NSLog(@”变量t5=%@ count=%d 地址=%lx “,t5,[t5 retainCount],&t5);
NSLog(@”t3 retain”);
[t3 retain];
NSLog(@”变量t3=%@ count=%d 地址=%lx “,t3,[t3 retainCount],&t3);
NSLog(@”变量t4=%@ count=%d 地址=%lx “,t4,[t4 retainCount],&t4);
NSLog(@”变量t5=%@ count=%d 地址=%lx “,t5,[t5 retainCount],&t5);
NSLog(@”t3 release”);
[t3 release];
//[t4 release];
NSLog(@”变量t3=%@ count=%d 地址=%lx “,t3,[t3 retainCount],&t3);
NSLog(@”变量t4=%@ count=%d 地址=%lx “,t4,[t4 retainCount],&t4);
NSLog(@”变量t5=%@ count=%d 地址=%lx “,t5,[t5 retainCount],&t5);
NSLog(@”t4 release”);
[t4 release];
//[t4 release];
NSLog(@”变量t3=%@ count=%d 地址=%lx “,t3,[t3 retainCount],&t3);
NSLog(@”变量t4=%@ count=%d 地址=%lx “,t4,[t4 retainCount],&t4);
NSLog(@”变量t5=%@ count=%d 地址=%lx “,t5,[t5 retainCount],&t5);
2010-06-04 18:29:19.177 memmanage[2926:a0f] COPY retain 差异测试
2010-06-04 18:29:19.177 memmanage[2926:a0f] 变量t3=t3 count=1 地址=7fff5fbff750
2010-06-04 18:29:19.178 memmanage[2926:a0f] t4 COPY t3
2010-06-04 18:29:19.178 memmanage[2926:a0f] 变量t3=t3 count=2 地址=7fff5fbff750
2010-06-04 18:29:19.178 memmanage[2926:a0f] 变量t4=t3 count=2 地址=7fff5fbff748
2010-06-04 18:29:19.179 memmanage[2926:a0f] 变量t5=t3 count=2 地址=7fff5fbff740
2010-06-04 18:29:19.179 memmanage[2926:a0f] t3 retain
2010-06-04 18:29:19.180 memmanage[2926:a0f] 变量t3=t3 count=3 地址=7fff5fbff750
2010-06-04 18:29:19.180 memmanage[2926:a0f] 变量t4=t3 count=3 地址=7fff5fbff748
2010-06-04 18:29:19.180 memmanage[2926:a0f] 变量t5=t3 count=3 地址=7fff5fbff740
2010-06-04 18:29:19.181 memmanage[2926:a0f] t3 release
2010-06-04 18:29:19.182 memmanage[2926:a0f] 变量t3=t3 count=2 地址=7fff5fbff750
2010-06-04 18:29:19.182 memmanage[2926:a0f] 变量t4=t3 count=2 地址=7fff5fbff748
2010-06-04 18:29:19.183 memmanage[2926:a0f] 变量t5=t3 count=2 地址=7fff5fbff740
2010-06-04 18:29:19.183 memmanage[2926:a0f] t4 release
2010-06-04 18:29:19.184 memmanage[2926:a0f] 变量t3=t3 count=1 地址=7fff5fbff750
2010-06-04 18:29:19.184 memmanage[2926:a0f] 变量t4=t3 count=1 地址=7fff5fbff748
2010-06-04 18:29:19.185 memmanage[2926:a0f] 变量t5=t3 count=1 地址=7fff5fbff740
Objective C assign© & retain区别的更多相关文章
- 【整理】Object-C中的属性(Property)的Setter:assign,copy,retain,weak,strong之间的区别和联系
iOS编程过程中,经常看到一些属性前面有些修饰符,比如copy,retain等. 这些关键字,是Object-C语言中,对于Property的setter. Mac官网: The Objective- ...
- iOS开发知识点:理解assign,copy,retain变strong
一..h和.m文件的变化说明 1.对于.h头文件,主要是将属性定义由retain变为strong @property (retain, nonatomic) 变为 @property (strong, ...
- 理解assign,copy,retain变strong
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一 ...
- 创建对象时引用的关键字,assign,copy,retain
创建对象时引用的关键字:assign: 简单赋值,不更改索引计数(强引用)copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索 ...
- objective c,copy, mutableCopy区别
copy总是返回不能被修改的对象,mutableCopy返回可以被修改的对象 例: NSArray *array = @[@"test", @"test2"]; ...
- copy,retain,assign,strong,weak的区别
引用地址:http://www.aichengxu.com/view/32930 一.assign,copy,retain 1.copy是内容复制,新建一个相同内容的不同指针,retain为指针复制, ...
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
IOS atomic与nonatomic,assign,copy与retain的定义和区别 atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. ...
- property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...
- iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...
随机推荐
- PHP file_get_contents() 函数
定义和用法 file_get_contents() 函数把整个文件读入一个字符串中. 和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串. file_get ...
- easyui源码翻译1.32--Calendar(日历)
前言 前几天加班比较忙 未能及时更新翻译的 今天多发布几篇..下载该插件翻译源码 日历控件显示一个月的日历,允许用户选择日期和移动到下一个或上一个月.默认情况下,一周的第一天是周日.它可以通过设置'f ...
- DHTMLX 前端框架 建立你的一个应用程序 教程(十一)--添加/删除表格中的记录
添加/删除表格中的记录 我们的最终功能是在表格中添加删除 我们通过单机工具栏上的按钮来实现添加删除 当我们单击添加按钮的时候, 表单中 第一行默认填写New contact 光标自动聚焦 当用户点击删 ...
- 汉字与区位码互转(天天使用的String存储的是内码),几个常见汉字编码,附有读书笔记
汉=BABA(内码)=-A0A0=2626(区位码)字=D7D6(内码)=-A0A0=5554(区位码) 各种编码查询表:http://bm.kdd.cc/ “啊”字是GB2312之中的第一个汉字,会 ...
- 转:Web service是什么?
作者: 阮一峰 我认为,下一代互联网软件将建立在Web service(也就是"云")的基础上. 我把学习笔记和学习心得,放到网志上,欢迎指正. 今天先写一个最基本的问题,Web ...
- C#中的几个线程同步对象方法
在编写多线程程序时无可避免会遇到线程的同步问题.什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的 ...
- WordPress Pretty Photo插件‘hashrel’参数跨站脚本漏洞
漏洞名称: WordPress Pretty Photo插件‘hashrel’参数跨站脚本漏洞 CNNVD编号: CNNVD-201311-405 发布时间: 2013-11-28 更新时间: 201 ...
- (转)如何正确使用C++多重继承
http://bigasp.com/archives/486 如何正确使用C++多重继承 2011年06月17日 — Asp J 原创文章,转载请注明:转载自Soul Apogee本文链接地址:如何正 ...
- [摘]selenium-ide编辑命令
----//编辑命令 selenium为我们录制的脚本不是100%符合我们的需求的,所以,编辑录制的脚本是必不可少的工作. 1. 编辑一行命令或注释. 在Table标签下选中某一行命令,命令由com ...
- oracle rac存储安装
oracle rac 10.2 的在 linux 上的存储选项 博客分类: Oracle OracleLinux项目管理配置管理 Oracle 集群需要存储的软件和数据 项目 内容 最少磁盘空间 C ...