用copy 还是 strong?
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?的更多相关文章
- 探究@property申明对象属性时copy与strong的区别
		一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ... 
- @proprety数组字典字符串用copy和strong区别(深浅拷贝)
		//// @proprety数组字典字符串用copy和strong区别(深浅拷贝).h// IOS笔记//// /* _proprety________copy_strong_________h ... 
- iOS之copy、strong使用,block特性
		身边一同事,我印象在过去三个月,有两次因为使用“copy”修饰UIKit控件的属性,导致程序崩溃.他还一本正经的说我以前一直使用copy. 好了,到这里我们就不得不说说什么时候使用copy.我的印象中 ... 
- NSString和NSMutablestring,copy和strong(转载)
		1.http://www.cocoachina.com/ios/20150512/11805.html 2.http://blog.csdn.net/winzlee/article/details/5 ... 
- iOS中copy和strong修饰符的区别
		iOS中copy和strong修饰符的区别 //用copys修饰的生成的都是不可变的对象 ,如果调用可变类型方法的直接报错 @property(nonatomic,copy)NSString * cp ... 
- copy 和 strong(或retain)的区别
		http://stackoverflow.com/questions/18526909/whether-i-should-use-propertynonatomic-copy-or-propertyn ... 
- iOS内存管理retain,assign,copy,strong,weak
		转自:http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html iOS的对象都继承于NSObject, 该对象有一个方法:retain ... 
- ios copy和strong,浅拷贝和深拷贝
		copy@property (nonatomic, copy) NSString *name;self.name = mutableString;这时,name对mutableString一个深拷贝, ... 
- [OC] @property时,copy、strong、weak、assign的区别
		@property(copy,nonatomic)NSMutableString*copyStr; @property(strong,nonatomic)NSMutableString*strongS ... 
随机推荐
- Python中Json解析的坑
			JSON虽好,一点点不对,能把人折腾死: 1.变量必须要用双引号 2.如果是字符串,必须要用引号包起来 Error:Expecting : delimiter: line 1 column 6 (ch ... 
- cocos2d-x3.0  XML解析
			在2dx3.0中xml解析已经不用自己找库了.已经为我们集成好了. text.xml <?xml version ="1.0" encoding ="UTF8&qu ... 
- Discuz常见小问题-如何关闭验证码
			进入后台,在防灌水,验证设置中可以切换哪些情况下是否使用验证码 如果启用验证码,也客户修改验证码的难度,样式.最后点击提交,完成之后可以退出到前台,测试是否能够不用验证码自动登录 
- SpringBoot添加对Log4j2的支持
			1.在添加对Log4j2的支持前,需要先把SpringBoot默认使用的Logback日志框架排除,修改pom.xml文件: <dependency> <groupId>org ... 
- jQuery 操作 radio、select、checkbox
			<script type="text/javascript"> $(function () { 一.radio 1.获取选中值,三种方法都可以: $('input:ra ... 
- 微软BI 之SSAS 系列 - 自定义的日期维度设计
			SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ... 
- Redis中取得所有Key、过期时间配置与获取、Key过期通知。
			string connection = "127.0.0.1:6379,password=xxxxx,connectRetry=5"; [TestMethod] public vo ... 
- Java WebSockets
			https://github.com/TooTallNate/Java-WebSocket Java WebSockets This repository contains a barebones W ... 
- dubbo应用架构演进路线图
			1.单应用单服务器: 2.单应用拆分成多个应用并部署到多个服务器: 3.单应用拆分成多个应用并实现分布式部署: 4.流动计算框架(用于提高机器利用率的资源调度和治理中心). 
- exception java.lang.OutOfMemoryError: Java heap space
			1.情景展示 java内存溢出异常,将程序代码问题排除在外,如何增大JVM的使用内存? 2.解决方案 在eclipse中的解决办法:增大你要运行的测试类的内存分配. 点击运行或debug按钮旁的 ... 
