细说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的要注意是否由于原数组的修改而影响新数组的值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值