天天看点

细说copy与strong一、NSArray进行copy二、NSMutableArray进行copy三、NSMutableArray的copy属性变成strong

细说copy与strong

  • 一、NSArray进行copy
    • 上面的代码也可以换成属性值进行copy,如下:
  • 二、NSMutableArray进行copy
    • 这时候做修改前面数组的操作,观察结果如下:
  • 三、NSMutableArray的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的要注意是否由于原数组的修改而影响新数组的值。