2,NSArray用什么修饰?(NSArray用strong修饰会存在什么问题?深拷贝和浅拷贝的区别?)
NSDictionary、NSString 同 NSArray NSMutableDictionary、NSMutableString 同 NSMutableArray
对于NSArray对象,使用copy和strong都可以,只是我们需要针对不同的属性做不同的处理;如果害怕出错,使用copy属性修饰
重点:先区分copy修饰时,可变对象和非可变对象赋值的不同
使用copy和strong都可以,只是需要注意两种使用的不同。
对于NSMutableArray对象,如果赋值给一个属性为copy的NSArray对象,会进行一次深拷贝的操作,如果是strong则是浅拷贝。
a,在NSArray使用strong修饰的时候,如果将一个NSMutableArray直接赋值给这个NSArray对象,进行的则是浅拷贝,如果我们在赋值之后修改了这个NSMutableArray对象,NSArray对象也会跟着改变,因为他们指向的是同一块内存。这个时候正确的做法是使用copy方法进行赋值
b,如果使用的是copy属性修饰,直接赋值进行的就是一个深拷贝操作,上面的操作不会出现问题
NSMutableArray应该使用strong修饰;如果需要进行深拷贝(NSMutableArray或NSArray对象的深拷贝),使用mutableCopy方法
@property \(nonatomic, strong\) NSMutableArray _mutArr1;
@property \(nonatomic, copy\) NSMutableArray _mutArr2;
NSMutableArray *mutArr = [NSMutableArray array];
[mutArr addObject:@"1"];
self.mutArr1 = mutArr; // 浅拷贝
self.mutArr2 = mutArr; // 直接赋值后,self.mutArr2变成了一个NSArray
[self.mutArr1 addObject:@"22"]; // 正确
[self.mutArr2 addObject:@"333"]; // crash
结果:
mutArr = 0x60400044d560, self.mutArr1 = 0x60400044d560, self.mutArr2 = 0x604000016040
NSArray *arr = @[@"11"];
self.mutArr1 = arr;
self.mutArr2 = arr;
结果:
arr = 0x60000000f0d0, self.mutArr1 = 0x60000000f0d0, self.mutArr2 = 0x60000000f0d0
a,将NSArray对象赋值给NSMutableArray,使用strong和copy修饰,都是浅拷贝,指针直接指向NSArray对象,NSMutableArray对象变成一个NSArray对象 b,将NSMutableArray赋值给NSMutableArray对象,使用strong修饰,浅拷贝,指针指向这个NSMutableArray对象;使用copy修饰,进行深拷贝,但上拷贝的结果是一个NSArray对象,这将导致错误 c,mutableCopy方法: mutableCopy方法虽然进行了一次深拷贝,拷贝一份NSMutableArray对象,但是如果使用copy修饰,又会进行一次深拷贝操作,从新变为一个NSArray对象。因此使用copy修饰时,使用mutableCopy并不能解决问题