欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Copy

程序员文章站 2024-01-17 22:11:46
...
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方法

相关标签: copy