copy:创建的是不可变副本,需要遵守NSCopying协议
mutableCopy:创建的是可变副本,需要遵守NSMutableCopying协议
拷贝对象中的内容会和以前的对象中的内容一致
一般情况下拷贝会生成一个新的对象
NSString *str = @"dashuabi";
NSMutableString *copy = [str mutableCopy];
NSLog(@"str = %@, copystr = %@", str, copy);
通过不可变对象调用了copy方法,就不会生成一个新的对象
通过不可变对象调用了mutablecopy方法,会生成一个新的对象
浅拷贝:没有生成新的对象,本质为指针拷贝
深拷贝:生成了新的对象,会创建一个新的对象
所有的字符串属性都用copy
@property(nonatomic, copy) NSString *name;
如果是block使用copy,并不是拷贝,而是转移到堆中
block默认存储在栈中,栈中的block访问到外界的对象,不会进行retain
block如果在堆中,如果在block中访问了外界对象,会对外界对象进行一次retain
可以使用copy保存block,可以保存住block中使用的外界对象,避免调用block的时候,外界对象就已经被释放了
在MRC中,一个对象中的block引用到了对象自己,为了避免内存泄漏,将对象修饰为 __block
当要对一个对象使用copy时,要重写copyWithZone方法
- (id)copyWithZone:(NSZone *)zone
{
// 1.创建一个新的对象
Person *p = [[[self class] allocWithZone:zone] init];
// 2.给新对象赋值
p.age = _age;
p.name = _name;
// 3.返回新的对象
return p;
}
子类在copy时,必须重写copywithzone方法,先调用父类的copywithzone方法