小探NSArray和NSMutableArray的copy与mutableCopy

copy与mutableCopy纠缠了很久,实践才是检验真理的唯一标准,写了一个test看下区别~

先顺带看下String和NSMutableString的区别

小探NSArray和NSMutableArray的copy与mutableCopy_第1张图片
string copy test


小探NSArray和NSMutableArray的copy与mutableCopy_第2张图片
string copy结果



小探NSArray和NSMutableArray的copy与mutableCopy_第3张图片
mutableString  test


小探NSArray和NSMutableArray的copy与mutableCopy_第4张图片
结果


接下来关于array,先声明两个不同修饰符的数组:

@property (nonatomic, copy)NSMutableArray *copyedArr;

@property (nonatomic, strong)NSMutableArray *strongArr;

(注:__NSArrayI是NSArray的真正类型 ,__NSArrayM是NSMutableArray真正类型)

copy NSArray to copy test
小探NSArray和NSMutableArray的copy与mutableCopy_第5张图片
NSArray copy-copy 结果


mutableCopy NSArray to copy test
小探NSArray和NSMutableArray的copy与mutableCopy_第6张图片
mutableCopy NSArray to copy 结果


copy NSArray to strong test
小探NSArray和NSMutableArray的copy与mutableCopy_第7张图片
copy NSArray to strong 结果


mutableCopy NSArray to strong test
mutableCopy NSArray to strong 结果


小探NSArray和NSMutableArray的copy与mutableCopy_第8张图片
copy NSMutableArray to copy test
小探NSArray和NSMutableArray的copy与mutableCopy_第9张图片
copy NSMutableArray to copy结果


小探NSArray和NSMutableArray的copy与mutableCopy_第10张图片
mutableCopy NSMutableArray to copy test
小探NSArray和NSMutableArray的copy与mutableCopy_第11张图片
mutableCopy NSMutableArray to copy结果


小探NSArray和NSMutableArray的copy与mutableCopy_第12张图片
copy NSMutableArray to strong test
小探NSArray和NSMutableArray的copy与mutableCopy_第13张图片
copy NSMutableArray to strong 结果
小探NSArray和NSMutableArray的copy与mutableCopy_第14张图片
mutableCopy NSMutableArray to strong test
小探NSArray和NSMutableArray的copy与mutableCopy_第15张图片
mutableCopy NSMutableArray to strong 结果

综上:

copy 浅拷贝,不拷贝对象本身,仅仅是拷贝指向对象的指针(某些特殊情况下也会拷贝整个对象内存到另一块内存中);

mutableCopy 深拷贝,是直接拷贝整个对象内存到另一块内存中;

类型判断可以下为准:

1.对于用copy修饰的 或者赋值的 变量肯定是不可变的;

2.对于不可变的对象,copy赋值,地址跟类型都没有变;

3.对于可变对象,copy赋值,地址变化,类型不可变,mutableCopy赋值,地址变化,类型可变

补充:

NSArray 被copy、strong修饰后的变化:

(1)strong:

被strong修饰之后,由于只是强引用,所以副本对象数组和源对象数组只是指向同一个内存区域,这样就会造成副本对象数组会随着源对象数组的改变而改变,即便有时候你并不想让副本对象跟着改变。

(2)copy:

 被copy修饰之后,源对象数组被copy了一份,源对象数组和副本对象数组是不同的,所以副本对象数组并不会随着源对象数组改变。

所以:

当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。

当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。

如有错误,欢迎指出~

你可能感兴趣的:(小探NSArray和NSMutableArray的copy与mutableCopy)