zoukankan      html  css  js  c++  java
  • NSMutableArray 被copy、strong修饰后的变化

    一、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了。


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

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

    (1)strong:

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

    (2)copy:

     被copy修饰之后,源对象数组被copy了一份,源对象数组和副本对象数组是不同的,所以副本对象数组并不会随着源对象数组改变。

    代码验证如下:

    [objc] view plain copy
    1. @property (nonatomic, strong) NSArray        *array;  
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. NSMutableArray *mutableArray = [NSMutableArray array];  
    2.       
    3.     [mutableArray addObject:@"1"];  
    4.       
    5.     self.array = [NSArray array];  
    6.     self.array = mutableArray;  
    7.       
    8.     NSLog(@"array---%@",self.array);  
    9.       
    10.     [mutableArray addObject:@"2"];  
    11.       
    12.     NSLog(@"array---%@",self.array);  

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


     

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


     

     

    综上所述:

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

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

  • 相关阅读:
    SQL跨服查询
    SQL时间函数
    MFC控件添加变量,control和value的区别
    error LNK2001 unresolved external symbol
    VS中C++代码折叠
    ERROR 2003 (HY000): Can't connect to MySQL server
    vs2012换肤功能,vs2012主题及自定义主题
    MFC、SDK和API有什么区别
    寻找子字符串int find_substr(char *s1, char *s2)
    document.title 跑马灯效果
  • 原文地址:https://www.cnblogs.com/yecong/p/6104669.html
Copyright © 2011-2022 走看看