美文网首页
NSArray和NSMutableArray关键字修饰

NSArray和NSMutableArray关键字修饰

作者: 小小啄 | 来源:发表于2019-06-20 09:13 被阅读0次

    1、NSArray 被copy、strong修饰后的变化:

    (1)strong:

    被strong修饰之后,由于只是强引用,所以副本对象数组和源对象数组只是指向同一个内存区域,这样就会造成副本对象数组会随着源对象数组的改变而改变,即便有时候你并不想让副本对象跟着改变。

    (2)copy:

    被copy修饰之后,源对象数组被copy了一份,源对象数组和副本对象数组是不同的,所以副本对象数组并不会随着源对象数组改变。
    具体看验证结果:

    copy修饰NSArray.jpg strong修饰NSArray.jpg

    (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;右边是什么,左边就是什么,并且是强引用新值,左边的类型会与右边的相同,不会改变。

    2、NSMutableArray 被copy、strong修饰后的变化:

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

    NSMutableArray.jpg

    (1)当源对象为可变的时候,最后打印aArray的类型是NSArray,而bArray的类型是NSMutableArray;并且最后在对两个数组分别做删除操作的时候,bArray所在的代码行可以通过,aArray所在的代码行则crash了。

    NSArray.jpg

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

    综上所述:

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

    相关文章

      网友评论

          本文标题:NSArray和NSMutableArray关键字修饰

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