美文网首页
iOS关于copy,mutablecopy;深拷贝,浅拷贝的浅见

iOS关于copy,mutablecopy;深拷贝,浅拷贝的浅见

作者: mr_ios_zhang | 来源:发表于2020-08-29 15:11 被阅读0次

    首先我们先搞清楚深拷贝和浅拷贝的概念吧:

    深拷贝:内存地址的拷贝,重新开辟一块内存区域,和原来的内存区域不相关。

    浅拷贝:仅仅只是指针的拷贝,指向同一块内存空间。

    注意:copy出来的对象都是不可变对象。

    下面我们具体分析一下:

    1.copy的使用和理解

    首先我们要了解copy的意义是什么,其实copy方法的存在就是复制一份和原来互不影响的数据。了解到这个就是我们使用的前提。

    (1).对于不可变对象的copy是浅拷贝.

    从简单的开始:

    NSLog(@"%p",@"1");

    NSLog(@"%p",[@"1"copy]);

    打印输出的结果:

    2019-12-16 21:54:16.647 Delegate[89515:460912] 0x10c6851a0

    2019-12-16 21:54:16.647 Delegate[89515:460912] 0x10c6851a0

    指针地址完全一样,由此我们可以知道,对于不可变对象的copy只是指针的copy,也就是我们所说的浅拷贝,只是指针的拷贝。但是这个和我们所说的“和原来互不影响的数据”相违背了,为什么呢,其实苹果早就帮我们考虑到了这一点的,我们完全不需要担心这点的。

    copy方法拷贝的对象都是不可变的对象,原来的字符串也是不可变的字符串,既然都是不可变的字符串,他们其实没有必要生成2块内存的,可以共享内存空间的,所以同一个指针就够用了,能节省一点内存是一点嘛(对于targetpoint同样适用)。

    有同学可能要问了,既然指向同一个内存区域,那么我改变其中一个的值,另一个这不是也得改变嘛,我们来试一试

    ```

    NSString*str1=@"str1";NSString*str2=[str1 copy];

    ```

    我们改变str1的值,str2是不会改变的,这个时候他们会生成不同的内存地址,也就是说新开辟了内存空间。

    (2)对于可变对象的copy,生成的是不可变对象。

    2.mutablecopy的理解

    (1)mutablecopy进行的拷贝都是深拷贝,重新开辟了内存空间。

    (2)mutablecopy对可变对象的mutablecopy是可变的,对于不可变对象的mutablecopy是不可变的。

    3.对于数组中的copy其实对于数组里面的元素全都是指针copy,如果想要进行内存copy需要重新操作数组;

    4.对于自定义的对象,想要进行copy操作,需要实现nscopying或nsmutablecopying协议。同理,如果对一个数组进行copy,数组里面全都是自定义对象,那么这些对象全都要实现nscopying协议。

    相关文章

      网友评论

          本文标题:iOS关于copy,mutablecopy;深拷贝,浅拷贝的浅见

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