copy
复制
浅复制:指针的复制(地址的复制)
深复制:对象内容的复制
Foundion的基本对象复制
基本对象都实现的NSCoping和NSMutableCoping协议
都可以实现浅复制和深复制
copy和mutableCopy
copy复制出来的对象都是不可变的
mutableCopy复制出来的对象都是可变的
可变对象的copy和mutableCopy
可变对象的mutableCopy复制出来一个可变的对象,复制的含义是两份对象更改内容是互不影响的,就是改变一个不影响另一个,两个对象都是可变的,又互不影响,所以是深复制的不同对象
可变对象的copy出来的对象是不可变的,复制出来的对象的性质已经发生了变化,原对象的改变不会影响复制出来的对象(复制出来的是不可变的对象,不会改变),所以是深复制
不可变对象的copy和mutableCopy
不可变对象copy出来的对象是不可变的,既然两个对象都是不可变的,都不会发生改变,所以两者引用同一块地址,所以是浅复制
不可变对象的utableCopy出来的对象是可变的,复制出来的对象的性质已经发生了变化,复制出来的对象的改变不会影响原来的对象对象(原对象不可变的对象,不会改变),所以是深复制
总结:复制就是拷贝一份,但是由于copy出来的是不可变的,所以如果原来的对象也是不可变的,那么两者都使用同一地址即可,不必再分配内存创建一个新的对象
自定义对象的copy和mutableCopy
copy实现NSCopying协议的方法即可,在方法中创建一个新的对象,将当前对象的属性值赋值给创建出来的对象即可
mutableCopy实现NSMutableCopying中的方法即可,但是用的比较少,一般使用copy即可
- (id)copyWithZone:(NSZone *)zone{
Person *person = [[Person allocWithZone:zone] init];
person.age = self.age;
return person;
}
- 属性中从copy策略
- 使用strong同样可以强引用外部传来的对象,但是当外部对象在外部被改变时属性的值也将会发生改变
- 如果使用copy策略,会产生一个不可变的对象,外部的对象改变时属性值也不会发生改变
- 由于copy策略产生的对象都是不可变的,即使使用可变的对象去接收本质还是不可变的,如果调用可变对象的方法会发生crash
/** name属性值永远是不可变,所以定义为NSMutableString是不合理的,调用NSMutableString的方法会crash*/
@property (nonatomic, copy) NSMutableString *name;