NSMutableArray与NSArray

425 阅读2分钟

一、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);

打印: Untitled.png

由打印结果可知, 被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就直接赋值(强引用,指向同一块内存);