Copy

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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值