NSArray与NSMutableArray用copy修饰还是strong

这个是原文  http://blog.csdn.net/winzlee/article/details/51752354

一、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了一份,源对象数组和副本对象数组是不同的,所以副本对象数组并不会随着源对象数组改变。

代码验证如下:

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


 

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


 

 

综上所述:

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

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

仅作参考

用copy 还是 strong?的更多相关文章

  1. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  2. @proprety数组字典字符串用copy和strong区别(深浅拷贝)

    ////  @proprety数组字典字符串用copy和strong区别(深浅拷贝).h//  IOS笔记//// /* _proprety________copy_strong_________h ...

  3. iOS之copy、strong使用,block特性

    身边一同事,我印象在过去三个月,有两次因为使用“copy”修饰UIKit控件的属性,导致程序崩溃.他还一本正经的说我以前一直使用copy. 好了,到这里我们就不得不说说什么时候使用copy.我的印象中 ...

  4. NSString和NSMutablestring,copy和strong(转载)

    1.http://www.cocoachina.com/ios/20150512/11805.html 2.http://blog.csdn.net/winzlee/article/details/5 ...

  5. iOS中copy和strong修饰符的区别

    iOS中copy和strong修饰符的区别 //用copys修饰的生成的都是不可变的对象 ,如果调用可变类型方法的直接报错 @property(nonatomic,copy)NSString * cp ...

  6. copy 和 strong(或retain)的区别

    http://stackoverflow.com/questions/18526909/whether-i-should-use-propertynonatomic-copy-or-propertyn ...

  7. iOS内存管理retain,assign,copy,strong,weak

    转自:http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html iOS的对象都继承于NSObject, 该对象有一个方法:retain ...

  8. ios copy和strong,浅拷贝和深拷贝

    copy@property (nonatomic, copy) NSString *name;self.name = mutableString;这时,name对mutableString一个深拷贝, ...

  9. [OC] @property时,copy、strong、weak、assign的区别

    @property(copy,nonatomic)NSMutableString*copyStr; @property(strong,nonatomic)NSMutableString*strongS ...

随机推荐

  1. 为什么有的需要安全连接的的application只有开Fiddler才好用?

      Help! Running Fiddler Fixes My App??? Over the years, the most interesting class of support reques ...

  2. 推荐五星级C语言学习网站

    www.cprogrammingexpert.com (此网站,配合了大量动画,每一行代码,配合一副图片) 下面截取了部分的gif动画,大家可以认真看看, 相信作者花了很多心血,去制作这些动画. sc ...

  3. vcenter建立cluster

    参见: VMware vSphere 5.1 学习系列之六:vCenter Server 主机管理(2) http://bbs.watchstor.com/thread-166222-1-2.html ...

  4. Hibernate学习笔记三:常用数据库操作语句

    转载请注明原文地址: 一:HQL 1:HQL语句格式:select from POJO类名 where 条件表达式 group by 属性 having 聚集函数 order by 属性 [其中,fr ...

  5. 【leetcode】solution in java——Easy3

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412505.html 心得:看到一道题,优先往栈,队列,map,list这些工具的使用上面想.不要来去都是暴搜 ...

  6. MyArrayList——自己实现ArrayList

    注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5965205.html      代码已移植:https://github.com/ygj0930/MyAr ...

  7. 理解linux cpu load - 什么时候应该担心了

    译文原文: http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages 你可能已经很熟悉linux的平均load. ...

  8. Kinect2.0关节角度获取

    通过Kinect获取到关节的三维坐标点后可以根据向量点积或叉积公式计算出关节角度: $$\vec{a}\cdot \vec{b} = |\vec{a}||\vec{b}|cos\theta$$ vec ...

  9. PHP 调用ffmpeg

    PHP 调用ffmpeg linux ffmpeg安装,tar文件安装一直出错,一直无语 php-ffmpeg安装, tar文件安装也一直出错,一直无语 最后直接在系统上安装ffmpeg sudo a ...

  10. java第三节 面向对象(上)

    //第三讲 //面向对象(上) /* 理解面向对象的概念 面向过程 在一个结构体中定义窗体的大小,位置,颜色,背景等属性,对窗口操作的函数窗口本身的定义没有任何关系 如HideWindow, Move ...