Copy

作者: program袁 | 来源:发表于2015-08-28 00:24 被阅读100次

    一:非容器类

    1.copy: 返回一个不可变对象。分两种情况:

    (1)若原对象是不可变对象,那么返回原对象,并将其引用计数加 1 ;

    (2)若原对象是可变对象,那么创建一个新的不可变对象,并初始化为原对象的值,新对象的引用计数为 1。

    2.mutableCopy 创建一个新的可变对象,并初始化为原对象的值,新对象的引用计数为 1;

    二:容器类

    1.copy

    (1).不可变数组 copy retain计数加1地址相同

    (2).可变数组 copy 地址不同 创建一个新的不可变对象容器内对象拷贝的是指针(引用计数加1)

    (3).不可变数组 调用此方法:

    [[NSArray alloc] initWithArray:array copyItems:YES];

    文档说是深copy,但是copy后返回一个 地址不同新的不可变数组容器内拷贝的对象指针,引用计数加1(其实不是真正的深copy) 

    (4).不可变数组 调用此方法:

    [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject]];

    深copy后返回一个 地址不同新的不可变数组容器内对象也是深拷贝(真正的深拷贝)

    2.mutableCopy

    (1).无论是否可变数组mutableCopy后返回一个 地址不同新的可变数组容器内对象拷贝的是指针(引用计数加1)

    (2).可变数组 调用深拷贝方法:

    [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject]];

    深copy后返回一个 地址不同新的可变数组容器内对象也是深拷贝(真正的深拷贝)

    三.自定义对象

    如果是我们定义的对象,那么我们自己要实现NSCopying,NSMutableCopying这样就能调用copy和mutablecopy了

    - (id)copyWithZone:(NSZone*)zone

    {

    PersonObject*copy = [[[selfclass]allocWithZone:zone]init];

    copy->name= [namecopy];

    copy->imutableStr= [imutableStrcopy];

    copy->age=age;

    returncopy;

    }

    - (id)mutableCopyWithZone:(NSZone*)zone

    {

    PersonObject*copy =[[[selfclass]allocWithZone:zone]init];

    copy.name= [self.namemutableCopy];

    copy.age=age;

    returncopy;

    }

    1.copy:copy出一个新的对象,对象的属性是指针拷贝引用计数增加

    2.mutableCopy:copy出一个新的对象,对象的属性也是新的(深拷贝)

    相关文章

      网友评论

          本文标题:Copy

          本文链接:https://www.haomeiwen.com/subject/jzbhcttx.html