美文网首页
iOS深浅拷贝

iOS深浅拷贝

作者: sky_fighting | 来源:发表于2018-05-04 11:17 被阅读64次

    浅拷贝:复制一个指针,仍然指向已经存在的内存
    深拷贝:复制一个指针,并新申请一个内存


    浅拷贝图解 深拷贝图解

    关于拷贝的引用计数:
    浅拷贝:a、不可变类型,引用计数+1;b、可变类型,引用计数不变。
    深拷贝:可变类型、不可变类型,引用计数都不变

    //不可变类型copy
     NSArray *array = [[NSArray alloc] initWithObjects:@"123", nil];
     NSLog(@"开始值: %ld  地址:%p", [array retainCount],array);
        
     NSArray *copyArray = [array copy]; //浅拷贝
     NSLog(@"copy后: %ld   地址:%p", [array retainCount],copyArray);
        
     NSMutableArray *mutableCopyArray = [array mutableCopy]; //深拷贝
     NSLog(@"mutableCopy后: %ld   地址:%p", [array retainCount],mutableCopyArray);
    
    结果:
    2018-05-04 16:16:56.354587+0800 ReviewIOS[3203:465659] 开始值: 1  地址:0x604000014850
    2018-05-04 16:16:56.354761+0800 ReviewIOS[3203:465659] copy后: 2   地址:0x604000014850
    2018-05-04 16:16:56.354883+0800 ReviewIOS[3203:465659] mutableCopy后: 2   地址:0x604000247500
    
    //可变类型copy
      NSMutableArray *array = [[NSMutableArray alloc] init];
      [array addObject:@"123"];
      NSLog(@"开始值: %ld  地址:%p", [array retainCount],array);
        
      NSArray *copyArray = [array copy]; //深拷贝
      NSLog(@"copy后: %ld   地址:%p", [array retainCount],copyArray);
        
      NSMutableArray *mutableCopyArray = [array mutableCopy]; //深拷贝
      NSLog(@"mutableCopy后: %ld   地址:%p", [array retainCount],mutableCopyArray);
    
    结果:
    2018-05-04 16:18:44.204876+0800 ReviewIOS[3230:468629] 开始值: 1  地址:0x6000004403f0
    2018-05-04 16:18:44.205011+0800 ReviewIOS[3230:468629] copy后: 1   地址:0x60400000b770
    2018-05-04 16:18:44.205153+0800 ReviewIOS[3230:468629] mutableCopy后: 1   地址:0x600000440450
    
    关于什么情况下是深拷贝,什么情况下又是浅拷贝呢?如下图所示: 图解

    总结如下:
    对于不可变对象,copy为浅拷贝,mutableCopy为深拷贝;
    对于可变对象,copy和mutableCopy均为深拷贝;
    copy的结果为不可变对象,mutableCopy的结果为可变对象;

    相关文章

      网友评论

          本文标题:iOS深浅拷贝

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