以下对使用strong 和 copy的地方都适用
.h
@interface Test : NSArray
@property (nonatomic,strong) NSArray * sArray;
@property (nonatomic,copy) NSArray * cArray;
- (void) pri;
@end
.m
@implementation Test
- (void) pri
{
NSArray *array = @[@"one",@"two",@"three"];
self.cArray = array; //self(本对象)调用点方法(setter) ,属性为copy
self.sArray = array; //self(本对象)调用点方法(setter) ,属性为strong
NSLog(@"%p , %p",array,&array);
NSLog(@"%p , %p",_sArray,&_sArray);
NSLog(@"%p , %p",_cArray,&_cArray);
/* 输出为
2018-01-25 19:50:39.637630+0800 2[3833:246728] 0x6080002516a0 , 0x7ffee087b0e0
2018-01-25 19:50:39.638249+0800 2[3833:246728] 0x6080002516a0 , 0x608000035068
2018-01-25 19:50:39.638418+0800 2[3833:246728] 0x6080002516a0 , 0x608000035070
*/
}
@end
将 NSArray *array = @[@"one",@"two",@"three"];
换成 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"one",@"two", nil];
//因为NSMutableArray只有这种初始化方式,而没有字面量初始化方式
/* 输出为
2018-01-25 19:57:03.144418+0800 2[3900:250713] 0x604000057ee0 , 0x7ffeead42108
2018-01-25 19:57:03.145072+0800 2[3900:250713] 0x604000057ee0 , 0x604000023ea8
2018-01-25 19:57:03.145334+0800 2[3900:250713] 0x604000023ec0 , 0x604000023eb0
*/
结论:
- strong 和 copy修饰的属性对于不可变的源对象是浅拷贝,即将指针都指向了源对象地址
- strong 修饰可变源对象是浅拷贝,copy修饰可变源对象时候是深拷贝
- 在源对象为可变时候,因为copy会进行深拷贝,所以开销会较strong大
- 注意浅拷贝修改带来的修改,为避免不可预知的现象发生,建议使用copy