Objective C assign&copy & 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

时间: 2024-08-05 05:57:23

Objective C assign&copy & retain区别的相关文章

assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

arc其实并不是所谓的垃圾回收机制,其实arc只是编译器的一种特性,编译器会在编译阶段插入相应的内存管理代码,以实现自动的内存管理,这样就减少了因为程序员的一时疏忽或者项目过大而失误从而造成内存泄露,因为是编译器自动完成的代码插入所以arc的效率要高于垃圾回收机制. 在arc机制下dealloc中会由编译器自动插入释放属性的代码因此也不需要手动调用[super dealloc],当然arc只能管理foundation层的对象对于core foundation层的变量需要程序员手动去释放或者使用桥

【整理】Object-C中的属性(Property)的Setter:assign,copy,retain,weak,strong之间的区别和联系

iOS编程过程中,经常看到一些属性前面有些修饰符,比如copy,retain等. 这些关键字,是Object-C语言中,对于Property的setter. Mac官网: The Objective-C Programming Language – Declared Properties – Setter Semantics 中的解释是: Setter Semantics These attributes specify the semantics of a set accessor. They

iOS assign copy retain...含义

assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 Copy其实是建立了一个相同的对象,而retain不是: 比如一个NSString对象,地址为0×1111,内容为@"STR" Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象retain为1, 旧有对象没有变化 retain到另外一个NSString之 后,地址相同(建立一

理解assign,copy,retain变strong

举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存用来存储@' 装梵几的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' 装梵几的三室两厅' ,  2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111 下面分别看下(assign,retain,copy):  1.ass

iOS开发知识点:理解assign,copy,retain变strong

一..h和.m文件的变化说明 1.对于.h头文件,主要是将属性定义由retain变为strong [java] view plaincopy @property (retain, nonatomic) 变为 [java] view plaincopy @property (strong, nonatomic) 2.在ARC之前,我们经常在.m中使用分类拓展来增加私有的property [java] view plaincopy @interface MJViewController () @pr

转 iOS:ARC相关知识,assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

    自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误.     同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存.     总是通过属性来管理实例变量(init/dealloc除外),在dealloc中释放所有属性. dealloc中会自动加入释放实例变量的代码,因此不必要手段增加释放实例变量的代码.不需要手动调用[super  dealloc]   不要调用retain,release,autorelease,编译器会自动插入相关代码. 注

论NSString和NSMutableString 属性声明中copy/retain区别

直接上代码 1.先声明要测试的属性 2.NSMutableString进行赋值 ----我们打印出oldMStr地址和在不同赋值之后它的引用计数,看看到底有什么变化.最后我们打出这4个属性的具体的值和地址,看看地址和值有什么变化 -----从打印的结果中我们可以看出retain属性值的地址和原oldMStr地址相同,再看看oldMStr的引用计数,说明retain属性值的为浅复制.再看看copy属性值的情况,地址都改变了同时oldMStr的引用计数没法发生变化,当oldMStr值发生变化后,co

atomic与nonatomic,assign,copy与retain的定义和区别

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样: {lock} f (property != newValue) { [property release]; property = [newValue retain]; } {unlock} nonat

iOS开发-assign、retain、copy、strong、weak的区别

对于初学的开发者,对于assign.retain.copy.strong.weak的用法及意义可能不是很明白,我对于这个问题也研究了很久,写篇博文,巧巧代码,让我们来瞧瞧吧! 先定义一个Student类: #import <Foundation/Foundation.h> @interface Student : NSObject @property (nonatomic, copy) NSString *name; @end 然后先是mrc下的assign声明 @property (nona