标签:
时不时会有点迷惑retain、strong、copy三者之间的区别,还是记录下来好一点,先看代码:
创建一个类,定义属性
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, retain) NSString *strRetain; @property (nonatomic, strong) NSString *strStrong; @property (nonatomic, copy) NSString *strCopy; @property (nonatomic, retain) NSMutableString *strMutableRetain; @property (nonatomic, strong) NSMutableString *strMutableStrong; @property (nonatomic, copy) NSMutableString *strMutableCopy; @end
main方法里面代码:
Person *per = [[Person alloc] init]; NSString *name = @"原XM"; [per setStrRetain:name]; [per setStrStrong:name]; per.strCopy = name; NSMutableString *name2 = [[NSMutableString alloc] initWithString:@"原XM2"]; per.strMutableRetain = name2; per.strMutableStrong = name2; per.strMutableCopy = name2; NSLog(@"------ 改变之前打印 ------"); NSLog(@"per.strRetain: %@, ", per.strRetain); NSLog(@"per.strStrong: %@", per.strStrong); NSLog(@"per.strCopy: %@", per.strCopy); NSLog(@"per.strMutableRetain: %@", per.strMutableRetain); NSLog(@"per.strMutableStrong: %@", per.strMutableStrong); NSLog(@"per.strMutableCopy: %@", per.strMutableCopy); name = @"新XM"; [name2 appendString:@"新XM2"]; NSLog(@"------- 改变之后打印 -------"); NSLog(@"per.strRetain: %@", per.strRetain); NSLog(@"per.strStrong: %@", per.strStrong); NSLog(@"per.strCopy: %@", per.strCopy); NSLog(@"per.strMutableRetain: %@", per.strMutableRetain); NSLog(@"per.strMutableStrong: %@", per.strMutableStrong); NSLog(@"per.strMutableCopy: %@", per.strMutableCopy);
打印结果:
------ 改变之前打印 ------ per.strRetain: 原XM, per.strStrong: 原XM per.strCopy: 原XM per.strMutableRetain: 原XM2 per.strMutableStrong: 原XM2 per.strMutableCopy: 原XM2 ------- 改变之后打印 ------- per.strRetain: 原XM per.strStrong: 原XM per.strCopy: 原XM per.strMutableRetain: 原XM2新XM2 per.strMutableStrong: 原XM2新XM2 per.strMutableCopy: 原XM2
结论:
1、对于不可变对象来说:retain、strong、copy三者的作用是一样的,即当引用的原对象值改变后,其他引用该对象的属性值不会受影响,还是保持原来的值;
2、对于可变对象来说:retain、strong和copy的作用就有区别了,使用retain、strong修饰的属性,当引用的原对象值改变后,其他引用该对象的属性值会一起跟着变化,而copy修饰的属性的值还是保持原样。copy的作用主要也是体现在这里: 让属性值不会随着原引用对象的值改变而改变;
3、retain和strong的区别:作用是一样的,只是写法上的区别。在非arc机制时,是用retain关键字修饰;在arc机制后,一般都用strong关键字来代替retain了
标签:
原文地址:http://www.cnblogs.com/tandaxia/p/4475410.html