iOS基础之----深浅拷贝

1、复制一个对象为副本,开辟一块新的内存来存储副本对象。(注意这种情况例外:使用copy去复制一个不可变变量时,不会开辟新的内存,因为Foundation对这种情况作了优化。这种情况得到的结果与retain等价)


2、copymutableCopyretain之间的关系

    Foundation对象中,copy是一个不可变的对象时,作用相当于retain当使用mutableCopy时,不管源对象是否可变,副本是可变的,并且实现真正意义上的copy。当我们使用copy一个可变对象时,副本对象是不可变的。

3、copyMutableCopy的区别

    copy返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本。

4、copy和深copy

 (1)浅复制尽复制对象本身,对象里的属性、包含的对象不做复制

 (2)深复制复制全部,包括对象的属性和其他对象

 (3)Foundation框架支持复制的类,默认是浅复制

 (4)浅复制只是复制指针,并没有创建新的内存空间,深复制开辟了新的空间。

5、对象的自定义拷贝

   对象拥有复制特性,必须实现NSCopyingNSMutableCopying协议,实现该协议的   

   copyWithZone方法和mutableCopyWithZone方法

   深拷贝和浅拷贝的区别就在于copyWithZone方法的实现

-(id)copyWithZone:(NSZone *)zone

{

   //实现自定义浅拷贝

    Person *person=[[self class] allocWithZone:zone];

    person.age=_age;

    person.name=_name;

    return person;

}

-(id)copyWithZone:(NSZone *)zone

{

   //实现自定义深拷贝

    Person *person=[[self class] allocWithZone:zone];

    person.age=[_age copy];

    person.name=[_age copy];

    return person;

}

结果是一样的,是因为Foundation对于不可变复制对象而言,copy方法做了优化,相当于retain,故retaincount变成2。相当于 在copyWithZone方法中:return [self retain];

6、注意事项

(1)对于常量:拷贝之后没有分配内存。引用计数为-1

(2)对于不可变变量:拷贝之后不会分配内存,此时等价于retain操作,引用计数+1

(3)对于可变变量:重新分配一个内存区域。如果是浅拷贝,则2个对象共用子域和子对象。如果是深拷贝,则2个对象没有任何关系(即子区域、子对象都被拷贝了)

(4)NSFoundation,当我们copy的时一个不可变对象时,默认的copy都是浅拷贝,相当于retain

(5)当使用mutableCopy时,不管对象是否可变,都会实现深拷贝

(6)retain相当于两个对象指向同一个指针



你可能感兴趣的:(iOS)