Copy
要拷贝一个对象可以调用copy或者MutableCopy
遵守NSCopying之后才能调用Copy和MutableCopy方法
NSString 和 block 在任何时候声明都使用copy;
1>区别:
A.Copy产生一个不可变的副本
B.MutableCopy:产生一个可变的副本
2>比较:
深复制:(内容拷贝,深拷贝)复制一个对象一个地址 (可变,不可变对象调用MutableCopy,可变对象调用copy三种情况)
*原对象和副本对象是不同的两个对象
*原对象引用计数器不变,副对象计数器为1(新产生的)
*本质:产生新对象
浅复制:(指针拷贝,浅拷贝)复制一个对象,但是地址还是引用一个(只有不可变对象调用copy的时候才是深复制)
*原对象和副本对象是一个对象
*原对象(副对象)引用计数器+1
*本质:没有产生对象
3>自定义copy需要实现copyWithZone:
- (id)copyWithZone:(NSZone *)zone
{
// 1.注意返回值,这个方法中一定要返回一个新的Person对象
// 2.注意下参数:zone忽略掉
// 3.创建一个新的person兑现并返回
对象 *x = [[self.class alloc] init];
x.属性 = self.属性;
return x;
}
/*
A.任何对象调用Copy产生一个不可变的副本
B.任何对象调用MutableCopy:产生一个可变的副本
遵守NSCopying之后才能调用Copy和MutableCopy方法
*/
// copy产生不可变副本
NSMutableArray *nsm = [NSMutableArray arrayWithArray:@[@"1",@"2",@"3"]];
NSArray *n = [nsm copy];
NSLog(@"%@",n);
// MutavleCopy产生可变副本
NSMutableArray *nsm1 = [NSMutableArray arrayWithArray:@[@"1",@"2",@"3"]];
NSMutableArray *n1 = [nsm1 mutableCopy];
[n1 addObject:@"4"];
NSLog(@"%@",n1);