美文网首页
iOS内存管理(6)--NSArray与NSMutableArr

iOS内存管理(6)--NSArray与NSMutableArr

作者: eryuxinling | 来源:发表于2016-12-14 10:12 被阅读553次

一、NSMutableArray 被copy、strong修饰后的变化:
把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。

举例如下:

(1)copy:

@property (nonatomic, copy) NSMutableArray *a;
 NSMutableArray *b = [NSMutableArray array];
 a = b;

等同于

@property (nonatomic, strong) NSMutableArray *a;
 NSMutableArray *b = [NSMutableArray array];
 a = [b copy];
 a 被copy后就成了NSArray了。

(2)strong:
如果是strong,直接是赋值a = b;右边是什么,左边就是什么,并且是强引用新值,左边的类型会与右边的相同,不会改变。

为了验证以上说法,代码测试之后如下图:
由图可看到,当源对象为可变的时候,最后打印aArray的类型是NSArray,而bArray的类型是NSMutableArray;并且最后在对两个数组分别做删除操作的时候,bArray所在的代码行可以通过,aArray所在的代码行则crash了。

测试图片.png

二、NSArray 被copy、strong修饰后的变化:
(1)strong:
被strong修饰之后,由于只是强引用,所以副本对象数组和源对象数组只是指向同一个内存区域,这样就会造成副本对象数组会随着源对象数组的改变而改变,即便有时候你并不想让副本对象跟着改变。
(2)copy:
被copy修饰之后,源对象数组被copy了一份,源对象数组和副本对象数组是不同的,所以副本对象数组并不会随着源对象数组改变。
代码验证如下:

@property (nonatomic, strong) NSArray *array;
NSMutableArray *mutableArray = [NSMutableArray array];  

 [mutableArray addObject:@"1"];  
 self.array = [NSArray array];  
 self.array = mutableArray;   
 NSLog(@"array---%@", self.array);  

 [mutableArray addObject:@"2"];  
 NSLog(@"array---%@", self.array); 

打印结果如下:由图可知array随着mutableArray变化了。

图片.png

把array换成copy修饰的之后,打印结果如图:可见这次array并没有随着mutableArray改变。

图片.png
综上所述:
当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。

相关文章

网友评论

      本文标题:iOS内存管理(6)--NSArray与NSMutableArr

      本文链接:https://www.haomeiwen.com/subject/umkimttx.html