细说copy与strong
一、NSArray进行copy
NSArray *array = @[@"I ",@"am ",@“zd !”];
NSArray *arrayCopy = [array copy];
NSLog(@“array:%p”,array);
NSLog(@“arraycopy:%p”,arrayCopy);
打印结果如下:
2019-03-27 16:41:18.764836+0800 ZDLockTest[2561:223826] array:0x600002d8dc80
2019-03-27 16:41:18.764938+0800 ZDLockTest[2561:223826] arraycopy:0x600002d8dc80
可见NSArray进行copy之后生成的新指针与原指针指向同一内存地址,这时候其实和strong没有什么不同,这时候实际上是进行了一次浅拷贝(但并不是说copy就是浅拷贝)。
上面的代码也可以换成属性值进行copy,如下:
@property (nonatomic, copy) NSArray *arr;
NSArray *copyArr = @[@“1”,@“2”,@“3”];
self.arr = copyArr;
打印结果如下:
2019-03-27 17:32:00.284395+0800 ZDLockTest[2966:242317] copyArr:0x6000030b8870
2019-03-27 17:32:01.382180+0800 ZDLockTest[2966:242317] self.arr:0x6000030b8870
二、NSMutableArray进行copy
@property (nonatomic, copy) NSMutableArray *arr;
NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:@“a”,@“b”, nil];
self.arr = array;
打印结果如下:
2019-03-27 17:34:37.472264+0800 ZDLockTest[2996:243846] array:0x600003b32d60
2019-03-27 17:34:37.472379+0800 ZDLockTest[2996:243846] self.arr:0x600003564c20
且我们可以看到self.arr的属性
Printing description of self->_arr:
<__NSArrayI 0x600003564c20>(
a,
b
)
也就是self.arr已经变成了不可变数组。这是因为对NSMutableArray进行copy之后就会变成NSArray类型,自然两个指针不可能指向同一内存地址。
这时候做修改前面数组的操作,观察结果如下:
[array removeObjectAtIndex:0];
Printing description of array:
<__NSArrayM 0x600003b32d60>(
b
)
Printing description of self->_arr:
<__NSArrayI 0x600003564c20>(
a,
b
)
可见修改前面数组并不会对新数组产生影响。
三、NSMutableArray的copy属性变成strong
@property (nonatomic, strong) NSMutableArray *arr;
NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:@“a”,@“b”, nil];
self.arr = array;
[array removeObjectAtIndex:0];
打印结果如下:
Printing description of self->_arr:
<__NSArrayM 0x600002e08120>(
b
)
Printing description of array:
<__NSArrayM 0x600002e08120>(
b
)
这个时候strong使得新指针与原指针指向了同一内存,也就是持有同一个对象,所以原内容改变,新内容也发生改变。此时将arr换成NSArray是同样的结果。因为array会将strong属性的arr变成NSMutableArray类型。
总结
无论是strong还是copy属性,都要慎用,strong是强引用,而copy是对新内容进行拷贝,但并不保留新值。copy的不能进行数组的修改,strong的要注意是否由于原数组的修改而影响新数组的值。