用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
来源:互联网 发布:js onclick 字符串变量 编辑:程序博客网 时间:2024/05/24 15:39
1、因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
2、如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。
为了理解这种做法,首先要知道,对非集合类对象的copy操作:
在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:
[immutableObject copy] // 浅复制[immutableObject mutableCopy] //深复制[mutableObject copy] //深复制[mutableObject mutableCopy] //深复制
比如以下代码:
NSMutableString *string = [NSMutableString stringWithString:@"origin"];//copyNSString *stringCopy = [string copy];
查看内存,会发现 string、stringCopy 内存地址都不一样,说明此时都是做内容拷贝、深拷贝。即使你进行如下操作:
[string appendString:@"origion!"]
stringCopy的值也不会因此改变,但是如果不使用copy,stringCopy的值就会被改变。 集合类对象以此类推。 所以,
用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。
参考链接:iOS 集合的深复制与浅复制
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 用 @property 声明的 NSString (或 NSArray,NSDictionary) 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?
- iOS 面试题~用@property声明NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 用@property声明的NSString, NSArray, NSDictionary 为什么要用copy ?
- NSString为什么要用copy关键字,如果用strong会有什么问题 OC中的深拷贝与浅拷贝
- iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因
- NSString为什么要用copy关键字,用strong会有什么问题?
- iOS NSString,NSArray,NSDictionary声明属性关键字
- NSString 使用 copy 关键字和 strong 关键字修饰的异同
- NSString为什么用copy而不是strong,NSMutableString为什么用strong而不是用copy(或者NSArray及NSMutableArray等)
- iOS NSString,NSArray,NSDictionary的Copy属性使用
- iOS NSString,NSArray,NSDictionary的Copy属性使用
- 关于声明控件用weak和strong的问题&NSString用copy好还是strong
- 深入理解@property的关键字:weak,strong,copy,assign,unsafe_unretained
- OC中@property属性关键字的使用(assign/weak/strong/copy)
- 算法竞赛入门例题3-5生成元
- VS2010添加——开始执行(不调试)
- POJ 1003 Hangover GCC编译
- linux系统学习之管道
- MySQL binlog基本用法
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- jquery.form&jersey异步上传图片(SpringMVC版本)
- Java千百问_06数据结构(019)_Arrays类有什么功能
- Qt5给Excel添加批注
- java Base64加密实现
- DirectUI浅谈
- 多线程下载
- Android Dev Intro - Eclipse Crashing with JVM Exit code=2
- dom4j解析spring.xml 对象解析(二)