现在的位置: 首页 > 综合 > 正文

copy、mutableCopy详解

2013年09月21日 ⁄ 综合 ⁄ 共 896字 ⁄ 字号 评论关闭

首先呢,copy后得到的对象都是不可变的,mutableCopy后得到的对象都是可变的。

1、非容器对象(NSString)

    (11) 如果源对象是不可变的:
                111. 那么copy后的对象(返回对象是不可变的)、源对象 都是同一个对象,对象的地址是一样的。既然指针地址都一样,那么指向的内容肯定也是一样的。俗称“浅拷贝”。Foundation框架中支持复制的类,默认是浅拷贝。
                112. mutableCopy俗称“深拷贝”,会拷贝对象的地址以及内容,指针的地址(栈地址),指针指向的内容地址(堆地址)都会变。返回一个可变的对象。
    (12) 如果源对象是可变的(NSMutableString):
                121.这时候copy和mutableCopy都是深拷贝,会拷贝整个对象,对象的地址和内容都会拷贝。但是copy返回的对象是不可变的,文章开头已说明。
2、容器对象(NSArray、NSDictionary、NSSet等)
     (21) 如果源对象是不可变的:
                211. copy后,这一点和上面的111是一模一样的。
                212. mutableCopy只拷贝对象的地址,但是容器的内容(即容器内的对象)并没有拷贝,指针指向的内容地址(堆地址)没有变,也就是说两个指针同时指向一块内存区域。返回一个可变的对象。那么我们要做到真正意义上的深拷贝(拷贝容器以及容器的内容),那么就得遍历容器,直到容器里面的对象不是容器对象为止,再把遍历后每一个对象进行mutableCopy,返回一个新的可变对象才对。
    (22) 如果源对象是可变的:

                221. 这时候copy和mutableCopy同样只拷贝对象的地址,但是容器的内容(即容器内的对象)并没有拷贝,指针指向的内容地址(堆地址)没有变,也就是说两个指针同时指向一块内存区域。返回一个可变的对象。那么我们要做到真正意义上的深拷贝(拷贝容器以及容器的内容),那么就得遍历容器,直到容器里面的对象不是容器对象为止,再把遍历后每一个对象进行mutableCopy,返回一个新的可变对象才对。

抱歉!评论已关闭.