美文网首页
可变数组&不可变数组修饰符的使用

可变数组&不可变数组修饰符的使用

作者: coding_Liu | 来源:发表于2019-06-06 14:26 被阅读0次

结论:
当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。

当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。

验证code:
一、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了。

[图片上传中...(image.png-3f1fc9-1559802206373-0)]

当源对象为不可变的时候,最后得到的aArray和bArray都是不可变的。aArray是不可变的原因是被copy,bArray是不可变的原因是源对象为不可变,与源对象保持一致。并且在对bArray进行删除操作的时候就crash了。

image.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变化了。

image.png

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

image.png

原文:https://blog.csdn.net/winzlee/article/details/51752354

相关文章

  • Swift学习 -- 数组

    Swift中的数组,能存放不同类型的元素。 1.定义 不可变数组 用let修饰符修饰的数组,就是不可变数组。例子:...

  • Swift中的数组

    使用 let 定义 不可变数组.使用 var 定义 可变数组.数组使用 [ ] 来表示.Swift中 数组可以直...

  • Swift 数组 和 字典的使用

    swift数组的使用 1.定义数组 1>定义不可变数组:使用let修饰标识符定义出来的数组就是不可变数组 let ...

  • 3大数据结构类之——不可变数组NSArray

    OC的数组同样分为不可变数组和可变数组,可变数组是不可变数组的子类,先来说不可变速数组 数组查询的相关方法 数组枚...

  • Swift 学习笔记二

    注,1;使用var 声明的数组 为,可变数组。使用let 声明的数组为不可变数组 2;数组的索引 从0 开始到 A...

  • 关于数组的深复制浅复制

    数组使用copy和MutableCopy复制: 1.不可变数组+copy=浅复制 2.不可变数组+mutableC...

  • Swift3.0 基础语法之数组&字典-Array&am

    1. 定义数组 1>定义不可变数组:使用let 修饰标识符定义出来的数组是不可变数组 let array = ["...

  • # 集合

    数组 数组使用 [] 定义,这一点与 OC 相同 遍历 通过下标获取指定项内容 可变&不可变let 定义不可变数组...

  • 踩坑总结

    1、数组去重使用 distinctUnionOfObjects.self 去重后会吧可变数组变为不可变数组,...

  • scala数据结构与可变不可变

    数组:可变与不可变不可变数组是指数组的长度是不可变的,但是数组对应的元素是可变的可变数组的长度和元素都可以改变 不...

网友评论

      本文标题:可变数组&不可变数组修饰符的使用

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