时不时会有点迷惑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