一、NSMutableArray与NSArray
1、NSArray被strong和copy修饰之后
(1)strong
被strong修饰之后,由于只是强引用,所以修饰后的对象数组和源对象数组只是指向同一块内存区域,会造成修饰后的对象数组会随着源对象数组的改变而改变。即便有时候你并不想让修饰后的对象跟着改变。
(2)copy
被copy修饰之后,源对象数组被copy了一份,源对象数组和修饰后的对象数组是不同的,所以修饰后的对象数组不会跟着源对象数组改变。
@property(nonatomic, strong) NSArray arrayStrong;
@property(nonatomic*, copy) NSArray *arrayCopy;
NSMutableArray *mArray = [NSMutableArray arrayWithObject:@"obj1"];
self.arrayStrong = mArray;
self.arrayCopy = mArray;
mArray addObject:@"obj2"];
NSLog(@"NSMutableArray -%p -%@",mArray,mArray);
NSLog(@"arrayStrong -%p -%@",self.arrayStrong,self.arrayStrong);
NSLog(@"arrayCopy -%p -%@",self.arrayCopy,self.arrayCopy);
打印:
由打印结果可知,
被strong修饰的array随着mutableArray的变化而变化;
被copy修饰的array并不随着改变;
strong:arrayStrong与可变数组mArray指向同一块内存区域,mArray内容改变,导致arrayStrong内容改变,因为二者是同一个东西;
copy:arrayCopy在赋值之前,将mArray内容拷贝,创建一块新的内存区域,两者没有关系,所以mArray的改变不会导致arrayCopy的改变;
综上所述:
当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong;
当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy;
2、NSMutableArray被strong和copy修饰之后
@property(nonatomic, strong) NSMutableArray arrayStrong;
@property(nonatomic*, copy) NSMutableArray *arrayCopy;
NSMutableArray *mArray = [NSMutableArray arrayWithObject:@"obj1"];
self.arrayStrong = mArray;
self.arrayCopy = mArray;
[self.arrayStrong addObject:@"obj2"];
NSLog(@"arrayStrong -%p -%@",self.arrayStrong,self.arrayStrong);
[self.arrayCopy addObject:@"obj3"];
NSLog(@"arrayCopy -%p -%@",self.arrayCopy,self.arrayCopy);
(1)当NSMutableArray用copy修饰的时候会崩溃,因为对arrayCopy进行了增删改操作,而copy后的数组变成了NSArray不可变数组,没有响应增删改操作就会报错;
报错信息:
***** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleObjectArrayI addObject:]: unrecognized selector sent to instance 0x6000024e4240'**
(2)如果是strong就直接赋值(强引用,指向同一块内存);