美文网首页iOS学习将来跳槽用
简单的理解深拷贝和浅拷贝

简单的理解深拷贝和浅拷贝

作者: 夕儿77 | 来源:发表于2017-11-16 16:37 被阅读15次

1.深拷贝浅拷贝定义 :

A.浅拷贝只拷贝值,不开辟新的内存空间
B.深拷贝,不但拷贝值还开辟新的内存空间

2.Foundation框架下默认支持copy的对象类型有:

NString、NSArray、NSNumber、NSDictionar、NSMutableString、NSMutablerArray、NSMutableDictionary等

3.我这里只对 NSString/ NSMutableString/ NSArray /NSMutableArray 测试 (只做借鉴使用)

 //1.string
        //1.1 NSString测试
        NSString *str = @"hanmengmeng";
        
        NSString *copyStr = [str copy]; //浅拷贝
        NSMutableString * copymuStr = [[NSMutableString alloc] init];
        copymuStr = [str copy];//copy时 可变字符串等同于不可变字符 浅拷贝
        
        NSLog(@"str %p,copyStr %p, copymuStr %p",str,copyStr,copymuStr);
        
        
        NSString *mutableCopyStr = [str mutableCopy];//深拷贝
        NSMutableString * mutableCopyMuStr = [[NSMutableString alloc] init];
        mutableCopyMuStr = [str mutableCopy]; //深拷贝
        
        NSLog(@"str %p, mutableCopyStr %p, mutableCopyStr %p",str,mutableCopyStr,mutableCopyMuStr);
image.png
        //1.2 NSMutableString测试 (可变)
        NSMutableString *mustr = [NSMutableString stringWithFormat:@"hahah"];

        NSString *copystr  = [mustr copy];//深拷贝
        NSMutableString * copymustr = [[NSMutableString alloc] init];
        copymustr = [mustr copy];//深拷贝

        NSLog(@"mustr %p ,copystr %p, copymustr %p",mustr,copystr, copymustr);

        NSString *mutableCopystr = [mustr mutableCopy]; //深拷贝
        NSMutableString * mutableCopymuStr = [[NSMutableString alloc] init];
        mutableCopymuStr = [mustr mutableCopy];//深拷贝

        NSLog(@"mustr %p ,mutableCopystr %p, mutableCopymuStr %p",mustr,mutableCopystr, mutableCopymuStr);
image.png
        //2.array
        //2.1 NSArray 测试
        NSArray *array = [NSArray arrayWithObjects:@"han",@"meng",@"meng", nil];

        NSArray *copyArray = [array copy]; //浅拷贝
        NSMutableArray *copymuArray = [[NSMutableArray alloc] init];
        copymuArray = [array copy]; //浅拷贝

        NSLog(@"array %p ,copyArray %p, copymuArray %p",array,copyArray, copymuArray);

        NSArray *mutableCopyArray = [array mutableCopy];  //深拷贝
        NSMutableArray *mutableCopymuArray = [[NSMutableArray alloc] init];
        mutableCopymuArray = [array mutableCopy];  //深拷贝

        NSLog(@"array %p ,mutableCopyArray %p, mutableCopymuArray %p",array,mutableCopyArray, mutableCopymuArray);
image.png
 //2.2 NSMutableArray 测试
        NSMutableArray * marray =[[NSMutableArray alloc] initWithObjects:@"a",@"b",@"c" ,nil];

        NSArray *copyMArray = [marray copy]; //深拷贝
        NSMutableArray *copymMarray = [[NSMutableArray alloc] init];
        copymMarray = [marray copy]; //深拷贝

        NSLog(@"array %p ,copyMArray %p, copymMarray %p",array,copyMArray, copymMarray);

        NSArray *mutableCopyMArray = [marray mutableCopy]; //深拷贝
        NSMutableArray *mutableCopymMarray = [[NSMutableArray alloc] init];
        mutableCopymMarray = [marray mutableCopy]; //深拷贝

        NSLog(@"array %p ,mutableCopyMArray %p, mutableCopymMarray %p",array,mutableCopyMArray, mutableCopymMarray);
image.png

4. 不可变类型的copy是浅拷贝 可变的类型copy和mutableCopy都是深拷贝 (个人观点,仅供参考)

5.附加 脑袋抽抽测试

 // 3.对象 通过实现NSCopying协议如下的唯一方法来达到对象拷贝的效果 所以不能用copy 或者 mutableCopy
        NSObject * obj = [[UIView alloc] init];
        NSObject * copyObj = [obj copy];
        NSObject * mutableCopyobj = [obj mutableCopy];
        NSLog(@"%p,%p,%p",obj,copyObj,mutableCopyobj);
//要用这两个方法,这是代理方法,别忘了遵守协议
- (id)copyWithZone:(nullable NSZone *)zone;
- (id)mutableCopyWithZone:(nullable NSZone *)zone;

相关文章

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • 深浅拷贝,面向对象,Symbol,Set,Map

    一:浅拷贝与深拷贝对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互影响。对象的深拷贝:简单理解深拷贝是...

  • 认识js下的浅拷贝与深拷贝

    浅拷贝与深拷贝 首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只拷贝一...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • js浅拷贝、深拷贝

    前言 本文主要简单讲一下什么是浅拷贝、什么是深拷贝、深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝。 一...

  • 简介深浅拷贝

    深浅拷贝 python 直接赋值,浅拷贝和深拷贝 直接赋值 其实就是对象的引用 (可以理解成浅拷贝) 浅拷贝: 拷...

  • iOS 简单理解---浅拷贝,深拷贝

    浅拷贝,深拷贝。 1、个人简单理解就是: 浅拷贝没有创建新对象,深拷贝创建新的对象 从输出结果可以看出:1:不管是...

网友评论

    本文标题:简单的理解深拷贝和浅拷贝

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