因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
如果我们使用的是strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变”(immutable)的字符串,确保对象中的字符 值 会 意间变动。
只要实现属性所 的对象是“可变的” (mutable),就应该在设置新属性值时拷
份。
举 说明:
定义 个以 strong 修饰的 array:
@property (nonatomic ,readwrite, strong) NSArray *array;
然后进 下 的操作:
NSArray *array = @[ @1, @2, @3, @4 ];
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
self.array = mutableArray;
[mutableArray removeAllObjects];;
NSLog(@"%@",self.array);
[mutableArray addObjectsFromArray:array];
self.array = [mutableArray copy];
[mutableArray removeAllObjects];;
NSLog(@"%@",self.array);
打印结果如下所示:
CYLArrayCopyDmo (
)
CYLArrayCopyDmo(
1,
2,
3,
4
)
为 解这种做法, 先要知道,两种情况:
对 集合类对象的 copy 与 mutableCopy 操作;对集合类对象的 copy 与 mutableCopy 操作。
1. 对 集合类对象的copy操作:
在 集合类对象中:对 immutable 对象进 copy 操作,是指针复制,mutableCopy
操作时内容复制;对 mutable 对象进 copy 和 mutableCopy 都是内容复制。 代
码简单表示如下:
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制
如以下代码:
NSMutableString *string = [NSMutableString stringWithString:@"origin"];
查看内存,会发现 string、stringCopy 内存地址都 样,说明此时都是做内容拷 、深拷 。即使你进 如下操作:
[string appendString:@"origion!"]
stringCopy 的值也 会因此改变,但是如果 使 copy,stringCopy 的值就会被改变。 集合类对象以此类推。 所以,
@property 声明 NSString、NSArray、NSDictionary 经常使 copy 关键字,是
因为他们有对应的可变类型:NSMutableString、NSMutableArray、
NSMutableDictionary,他们之间可能进 赋值操作,为确保对象中的字符 值 会
意间变动,应该在设置新属性值时拷 份。