1、NSMutableArray 被copy、strong修饰后的变化:segmentfault
把NSMutableArray用copy修饰有时就会crash,由于对这个数组进行了增删改操做,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,因此对其进行增删改操做就会报错。数组
举例以下:xcode
(1)copy:测试
@property (nonatomic, copy ) NSMutableArray *a;atom
NSMutableArray* b = [NSMutableArray array];spa
a = b;.net
等同于code
@property (nonatomic, strong) NSMutableArray *a;对象
NSMutableArray* b = [NSMutableArray array];blog
a = [b copy];
a 被copy后就成了NSArray了。
(2)strong:
若是是strong,直接是赋值a = b;右边是什么,左边就是什么,而且是强引用新值,左边的类型会与右边的相同,不会改变。
为了验证以上说法,代码测试以后以下图:
由图可看到,当源对象为可变的时候,最后打印aArray的类型是NSArray,而bArray的类型是NSMutableArray;而且最后在对两个数组分别作删除操做的时候,bArray所在的代码行能够经过,aArray所在的代码行则crash了。
当源对象为不可变的时候,最后获得的aArray和bArray都是不可变的。aArray是不可变的缘由是被copy,bArray是不可变的缘由是源对象为不可变,与源对象保持一致。而且在对bArray进行删除操做的时候就crash了。
2、NSArray 被copy、strong修饰后的变化:
(1)strong:
被strong修饰以后,因为只是强引用,因此副本对象数组和源对象数组只是指向同一个内存区域,这样就会形成副本对象数组会随着源对象数组的改变而改变,即使有时候你并不想让副本对象跟着改变。
(2)copy:
被copy修饰以后,源对象数组被copy了一份,源对象数组和副本对象数组是不一样的,因此副本对象数组并不会随着源对象数组改变。
代码验证以下:
打印结果以下:由图可知array随着mutableArray变化了。
把array换成copy修饰的以后,打印结果如图:可见此次array并无随着mutableArray改变。
综上所述:
当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。